保护果实
EditTime Limit: 3000/1000MS (Java/Others) Memory Limit: 65535/65535KB (Java/Others)
Submit Status
A有一棵果树,但是树上的果子总是还没有成熟就被B偷偷摘走了。于是,A想买一些栅栏想把果树围起来,让B再也偷不了果子。卖栅栏的人有N块栅栏,每块栅栏长度为ai。但是,卖栅栏的人与B关系很好,他不想随便卖给A。于是,他规定,如果要买第i块栅栏,那么必须要先买第i-1块栅栏(第一块栅栏除外)。同时,A是一个不想浪费的人,他想把他买的所有栅栏都用上,并且,让栅栏围成的图形是个多边形。那么,A最少需要买多少块栅栏呢。
Input
一共有两行。
第一行一个数,表示总共的栅栏数N(N≤1,000,000)” role=”presentation” style=”position: relative;”>N(N≤1,000,000)N(N≤1,000,000)。
第二行有N个数,第i个数表示第i块栅栏的长度ai” role=”presentation” style=”position: relative;”>aiai。
Output
输出一个数,表示最少需要的栅栏数,如果无解输出-1.
Sample input and output
Sample Input | Sample Output |
---|---|
3 3 4 5 | 3 |
Hint
Source
第八届ACM趣味程序设计竞赛第三场(正式赛)
越打越菜,和聚聚们的差距越来越大,这次2个半小时过了1题,队友当时都在怀疑自己是不是学这个,还是自己心态爆炸,开得题也不好,人菜就要多努力啊,正好因为某些事情换了队友鱼王聚聚希望可以抱抱大腿23333
三角形的判定是最长边大于其他两边之和,那么多边形就是最长边大于其他边之和,本质就是一枚水题
#include <cstdio>
#define N 1000000+10
int arr[N];
int main()
{
int n;
while(~scanf("%d",&n)) {
bool flag = false;
int k;
for(int i = 0;i < n; i++) {
scanf("%d",&arr[i]);
}
if(n<3) {
puts("-1");
continue;
}
int sum = 0;
int max = 0;
for(int i = 0;i < n; i++) {
if(arr[i] > max)
max = arr[i];
sum += arr[i];
if(sum>2*max) {
flag = true;
k = i;
break;
}
}
if(flag) printf("%d\n",k+1);
else puts("-1");
}
return 0;
}