给定包含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。
第一行包含一个整数N。
第二行包含N个整数A1, A2, ... AN。
对于50%的数据,1 ≤ N ≤ 1000
对于100%的数据,1 ≤ N ≤ 100000, -1000000 ≤ Ai ≤ 1000000
一个整数表示答案。
6 3 -5 2 -2 3 0
5
#include<stdio.h> #include<string.h> int a[100002]; int dp[100002]; int sign[100002]; int main() { int n; scanf("%d",&n); dp[0]=0; int sum=0; for(int i=1; i<=n; i++) { scanf("%d",&a[i]); dp[i]=dp[i-1]+a[i];/*存储前i项的和*/ sum+=a[i]; } sign[1]=dp[1]; for(int i=2; i<=n; i++) { if(dp[i]<sign[i-1]) { sign[i]=dp[i];/*前i项的和的最小值*/ } else sign[i]=sign[i-1]; } // for(int i=1;i<=n;i++)/*用于验证dp数组和sign数组的正确性*/ // printf("%d ",dp[i]); // printf("\n"); // for(int i=1;i<=n;i++) // printf("%d ",sign[i]); // printf("\n"); if(sum<=0) printf("-1\n"); else { int hou=0; for(int i=n; i>=1; i--) { hou+=a[i];/*从后往前加*/ if(i>1) { if(hou+sign[i-1]>0) { printf("%d\n",i); break; } } if(i==1) { printf("1\n"); break; } } } return 0; }