Codeforces 301A Yaroslav and Sequence 【思维】

来源:互联网 发布:淘宝历史宝贝精灵 编辑:程序博客网 时间:2024/05/29 21:32

题目链接:Codeforces 301A Yaroslav and Sequence

题意:有2n1个数,每次你可以将其中的n个数变号。问可以得到的最大和。

思路:其实对于2n1个数来说,总是可以把它们归于一个状态。记 <0的有cnt个,我们总是可以将cnt 限制到<n。因为cnt+1个负数和cnt个负数没什么区别。同理还可以继续限制到cnt<=n/2。然后就找吧,会发现——
1、n为奇数时,总可以将所有的数变成正数;
2、n为偶数时,cnt为奇数,会有一个数为负数,反之全为正数。

AC代码:

#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#include <vector>#include <queue>#include <map>#include <stack>#define PI acos(-1.0)#define CLR(a, b) memset(a, (b), sizeof(a))#define fi first#define se second#define ll o<<1#define rr o<<1|1using namespace std;typedef long long LL;typedef pair<int, int> pii;const int MAXN = 1e6 + 1;const int pN = 1e6;// <= 10^7const int INF = 0x3f3f3f3f;const int MOD = 1e9 + 7;void add(LL &x, LL y) { x += y; x %= MOD; }int a[300];int main(){    int n; cin >> n; int cnt = 0;    int ans = 0; int Min = INF;    for(int i = 1; i <= 2*n-1; i++) {        cin >> a[i]; cnt += a[i] < 0;        ans += abs(a[i]); Min = min(Min, abs(a[i]));    }    while(cnt >= n) {        cnt -= n;    }    if(n & 1) {        cout << ans << endl;    }    else {        if(cnt & 1) {            cout << ans - 2*Min << endl;        }        else {            cout << ans << endl;        }    }    return 0;}
0 0
原创粉丝点击