ABC:Sequence

题目描述

You are given an integer sequence of length N. The i-th term in the sequence is ai. In one operation, you can select a term and either increment or decrement it by one.
At least how many operations are necessary to satisfy the following conditions?
For every i (1≤i≤n), the sum of the terms from the 1-st through i-th term is not zero.
For every i (1≤i≤n−1), the sign of the sum of the terms from the 1-st through i-th term, is different from the sign of the sum of the terms from the 1-st through (i+1)-th term.

Constraints
2≤n≤105
|ai|≤109
Each ai is an integer.

输入

Input is given from Standard Input in the following format:
n
a1 a2 … an

输出

Print the minimum necessary count of operations.

样例输入

4
1 -3 1 0

样例输出

4

提示

For example, the given sequence can be transformed into 1,−2,2,−2 by four operations. The sums of the first one, two, three and four terms are 1,−1,1 and −1, respectively, which satisfy the conditions.

 

一道简单的贪心思维题.....结果自己太菜做不出来

题意一开始没看到那个sign 就是sum[i]+s[i+1]的和是-1或1最优,然后sum[i]不能为0

至于-1和1先后可以两次循环,取最小,前面也做过类似的

然后特判第一个为0的情况

没力气再敲一遍,下面代码网上的

#include <bits/stdc++.h>
#define ll long long 
using namespace std;  
   
ll ans1, ans2, sum1, sum2;  
int n, i;  
ll a[100005];  
int main(){  
    cin >> n;  
    for (i = 1; i <= n; i++) cin >> a[i];  
    if (a[1] >0)  
    {  
        sum1 = a[1];  
        ans2= a[1] + 1;  
        sum2 = -1;  
    }  
    else if (a[1] == 0)  
    {  
        sum1 = 1;  
        ans1 = ans2 = 1;  
        sum2 = -1;  
    }  
    else  
    {  
        sum1 = 1;  
        ans1 = abs(a[1]) + 1;  
        sum2 = a[1];  
    }  
    for (i = 2; i <= n; i++)  
    {     
        if (sum1 > 0)  
        {  
            if (a[i] + sum1 >= 0)  
            {  
                ans1 += a[i] + sum1 + 1;  
                sum1 = -1;  
            }  
            else 
            {  
                sum1 += a[i];  
            }  
        }  
        else 
        {  
            if (a[i] + sum1 <= 0)  
            {  
                ans1 += abs(sum1 + a[i]) + 1;  
                sum1 = 1;  
            }  
            else 
            {  
                sum1 += a[i];  
            }  
        }  
    }  
    if (sum1 == 0)  
    {  
        ans1++;  
    }  
    for (i = 2; i <= n; i++)  
    {  
        if (sum2 > 0)  
        {  
            if (a[i] + sum2 >= 0)  
            {  
                ans2 += a[i] + sum2 + 1;  
                sum2 = -1;  
            }  
            else 
            {  
                sum2 += a[i];  
            }  
        }  
        else 
        {  
            if (a[i] + sum2 <= 0)  
            {  
                ans2 += abs(sum2 + a[i]) + 1;  
                sum2 = 1;  
            }  
            else 
                sum2 += a[i];  
        }  
    }  
    if (sum2 == 0)  
    {  
        ans2++;  
    }  
    cout << min(ans1, ans2) << endl;  
}  
View Code

 

posted @ 2018-06-10 22:31  house_cat  阅读(271)  评论(0)    收藏  举报