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.
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
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; }
不要忘记努力,不要辜负自己
欢迎指正 QQ:1468580561

浙公网安备 33010602011771号