B - 循环数组 //题目链接
HihoCoder - 1704
给定包含N个整数的数组A1, A2, ... AN,你可以选择任意一个Ai,将Ai旋转到数组第一项,即将数组变成:
Ai, Ai+1, Ai+2, ... AN, A1, A2, ..., Ai-1
现在小Hi希望旋转之后的数组满足:
对于任意K(1 ≤ i ≤ N),前K项的和都是正数。
例如对于A=[3, -5, 2, -2, 3, 0],旋转成[3, 0, 3, -5, 2, -2]满足条件。
请你输出i,代表将Ai旋转到第一项满足条件。
如果有多解,你可以输出任意一个i。如果无解输出-1。
Input第一行包含一个整数N。
第二行包含N个整数A1, A2, ... AN。
对于50%的数据,1 ≤ N ≤ 1000
对于100%的数据,1 ≤ N ≤ 100000, -1000000 ≤ Ai ≤ 1000000
Output一个整数表示答案。
6 3 -5 2 -2 3 0Sample Output
5
首先,0不是整数。然后,当这N个数相加小于1,则无解,因为不管怎么排序,最终结果还是全部数相加>0才有解。最后,两个循环暴力判断是否<0;
代码:
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
int n,a[100005],ans=0;
scanf("%d",&n);
long long sum=0,mid;
for(int i=1; i<=n; i++)
{
scanf("%d",&a[i]);
sum+=a[i]; //全部相加和;
}
if(sum<=0)
{
printf("-1\n");
}
else //sum>0
{
for(int i=1; i<=n; i++)
{
mid=0;
if(a[i]<1) //大于1的才能放第一位。
continue;
else
{
for(int j=i; j<=n; j++)
{
mid+=a[j];
if(mid<=0)
break;
if(j==n)
ans=i;
}
for(int j=1; j<i; j++)
{
mid+=a[j];
if(mid<=0)
{
ans=0;
break;
}
}
if(ans) //已经有解了,跳出循环。
break;
}
}
if(ans)
printf("%d\n",ans);
else
printf("-1\n");
}
return 0;
}
其它样列:
//5//-9 -5 7 2 6
//1
//0