AtCoder Regular Contest 072

 

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;
}

 

 

神奇题

#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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值