C - Sequence


Time Limit: 2 sec / Memory Limit: 256 MB

Score : 300300 points

Problem Statement

You are given an integer sequence of length NN. The ii-th term in the sequence is aiai. 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 ii (1≤i≤n)(1≤i≤n), the sum of the terms from the 11-st through ii-th term is not zero.
  • For every ii (1≤i≤n−1)(1≤i≤n−1), the sign of the sum of the terms from the 11-st through ii-th term, is different from the sign of the sum of the terms from the 11-st through (i+1)(i+1)-th term.

Constraints

  • 2≤n≤1052≤n≤105
  • |ai|≤109|ai|≤109
  • Each aiai is an integer.

Input

Input is given from Standard Input in the following format:

nn
a1a1 a2a2 ...... anan

Output

Print the minimum necessary count of operations.


Sample Input 1 Copy

Copy

4
1 -3 1 0

Sample Output 1 Copy

Copy

4

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


Sample Input 2 Copy

Copy

5
3 -6 4 -5 7

Sample Output 2 Copy

Copy

0

The given sequence already satisfies the conditions.


Sample Input 3 Copy

Copy

6
-1 4 3 2 -5 4

Sample Output 3 Copy

Copy

8

 

题意:

n个数满足前缀和不为0且前缀和正负交替,每次可以增加1或者减少1,问最数的操作次数

分析:

奇正偶负

欧负奇正

两种情况,暴力+贪心

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100005;
const int MOD=1e9+7;
ll x[N];
int n,m;
int main()
{
int n;
scanf("%d",&n);

for(int i=1;i<=n;i++)
{
scanf("%lld",&x[i]);

}
ll sum=0;
ll ans1=0;
for(int i=1;i<=n;i++) //奇正偶负
{
sum+=x[i];
if(i%2==1)
{
if(sum<=0)
{
ans1+=(1-sum);
sum=1;
}
}
else
{
if(sum>=0)
{
ans1+=(sum+1);
sum=-1;
}
}
//cout<<sum<<endl;

}
// cout<<endl;
ll ans2=0;
sum=0;
for(int i=1;i<=n;i++)
{
sum+=x[i];
if(i%2==0)
{
if(sum<=0)
{
ans2+=(1-sum);
sum=1;
}
}
else
{
if(sum>=0)
{
ans2+=(sum+1);
sum=-1;
}
}
// cout<<sum<<endl;
}
cout<<min(ans1,ans2)<<endl;

return 0;
}

 

 

神奇题

AtCoder Regular Contest 072_i++

#include<bits/stdc++.h>
using namespace std;
#define R register int
#define LL long long

LL x, y;
void work()
{
scanf("%lld%lld", &x, &y);
if(abs(x - y) <= 1) printf("Brown\n");
else printf("Alice\n");
}

int main()
{
work();

return 0;
}