360校招之圈地運動

2021-09-26 05:49:28 字數 1837 閱讀 7495

圈地運動,就是用很多木棍擺在地上組成乙個面積大於0的多邊形~

小明喜歡圈地運動,於是他需要去小紅店裡面買一些木棍,期望圈出一塊地來。小紅想挑戰一下小明,所以給小明設定了一些障礙。障礙分別是:

1.如果小明要買第i塊木棍的話,他就必須把前i-1塊木棍都買下來。

2.買了的木棍都必須用在圈地運動中。

那麼請問小明最少買多少根木棍,才能使得木棍圍成的圖形是個面積大於0多邊形呢?

所謂 面積大於0的多邊形 可以理解為 凸多邊形

n條邊圍成凸n邊形的充要條件是:

四邊形:任選3邊之和都要大於第4邊(注意是任選,也就是說要滿足4個不等式)

n邊形:任選(n-1)邊之和都要大於第n邊.

這些都是根據公理(兩點之間線段最短)得來的

簡化:任選(n-1)邊之和都要大於第n邊( 複雜度過大)→

n-1邊的和大於最長邊,就能組成封閉多邊形**(合理)

然而自己沒想到,菜啊,用定理生搬硬套,程式設計全靠遍歷,不動腦筋。下面會貼自己的因為複雜度過高沒有通過的程式和參考程式**

n =

int(

input()

)lic =

list

(map

(int

,input()

.split())

)s,res =

,[]for i in

range

(len

(lic)):

sum(lic[

:i+1])

)for i in

range(2

,len

(lic)):

flag =

1for j in

range

(i+1):

if s[i]

-lic[j]

<=lic[j]

: flag =

0break

for i in

range

(len

(res)):

flag =

0if res[i]==1

:print

(i+3

) flag =

1break

if flag ==0:

print(-

1)

while1:

try:

nums =

int(

input()

) lists =

list

(map

(int

,input()

.strip(

).split(

' ')))

if nums <=2:

print

('-1'

) exit(

) index =

2for i in

range

(nums-2)

:# 因為在前面的sum中,把最長邊也加進去了,所以後面的max要乘2;

result =

sum(lists[

:index+1]

)-max(lists[

:index+1]

)*2if result >0:

print

(index+1)

exit(

) index +=

1print

('-1'

)except

:break

(被全方位吊打,繼續加油吧。。)

20190812 校招筆試題 圈地運動 360

圈地運動,就是用很多木棍擺在地上組成乙個面積大於0的多邊形。小明喜歡圈地運動,於是他需要去小紅店裡面買一些木棍,期望圈出一塊地來。小紅想挑戰一下小明,所以給小明設定了一些障礙。障礙分別是 1.如果小明要買第i塊木棍的話,他就必須把前i 1塊木棍都買下來。2.買了的木棍都必須用在圈地運動中。那麼請問小...

阿里校招之類例項化的順序

類a的定義 01packagecom.sequence.test 02 03publicclassa 13 例項變數 14string type 15 非靜態自由塊 16 20string size 21 建構函式 22publica 26 類b的定義 01packagecom.sequence.t...

360校招題之小明看花

小明有乙個花園,花園裡面一共有m朵花,對於每一朵花,都是不一樣的,小明用1 m中的乙個整數表示每一朵花。他很喜歡去看這些花,有一天他看了n次,並將n次他看花的種類是什麼按照時間順序記錄下來。記錄用a i 表示,表示第i次他看了a i 這朵花。小紅很好奇,她有q個問題,問 l,r 的時間內,小明一共看...