圈地運動,就是用很多木棍擺在地上組成乙個面積大於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 的時間內,小明一共看...