循环数组()

给定包含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

一个整数表示答案。

Sample Input
6  
3 -5 2 -2 3 0
Sample Output
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;
}

猜你喜欢

转载自blog.csdn.net/kuguotao/article/details/79763049