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