Codeforces Round #569 (Div. 2) B Nick and Array(贪心)

标签(空格分隔): 题解(codeforces)

ps:关于本题,昨晚熬夜到1:05打cf想涨分结果脑袋抽了,
一直B题wa9.mmp.没有想到0可以变成-1.没有想到修改绝对值最大的那个负数
rating掉到1340.mmp

首先正的变成负的。在绝对值上会增加1.所以先把正的变成负的
是奇数的情况下.全部是负的.将谁修改成正的.修改成正的绝对值要减1.
看下面的情况:

修改-2

修改-3

表面上看是修改最小的那个,也就是绝对值最大的那个为正的
假设数字按照绝对值递增排列,按照大小从大到小排序.

证明修改an要优于修改
记除去和的数字之间相乘的结果是
修改.

修改.

容易知道

并且

所以所以修改最优

#pragma GCC optimize("O2") 
#include 
using namespace std;

#define dbg(x) cerr << #x"=" << x << endl;
typedef long long LL;
const int MAX_N = 1e5+100;
int a[MAX_N];

int main(){
//  freopen("in.txt","r",stdin);    
    ios::sync_with_stdio(0); cin.tie(0);
    int n;
    cin >> n;
    for(int i = 1; i <= n; ++i){
        cin >> a[i];
        if(a[i] >= 0) a[i] = -a[i]-1;
    }
    if(n&1){
        int mn = -1;
        int id = 0;
        for(int i = 1; i <= n; ++i){
            if(mn >= a[i]){
                mn = a[i];
                id = i;
            }
        } 
        a[id] = -a[id]-1;
    }
    for(int i = 1; i <= n; ++i){
        cout << a[i] << " ";
    }
    cout << endl;
    return 0;
}

你可能感兴趣的:(Codeforces Round #569 (Div. 2) B Nick and Array(贪心))