Codeforces Round #374 (Div. 2) D. Maxim and Array

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #374 (Div. 2) D. Maxim and Array相关的知识,希望对你有一定的参考价值。

题解:

模拟题

虽然是个大模拟题,但是很考验思维的活跃度。

刚开始做的时候知道怎么做。但是自己的想法情况很多。分类枚举总是把自己混淆

这题教会我的是,要仔细思考分类的方式

这个题。根据枚举负数的个数奇偶来判断

为奇数:那么绝对值最小的数,如果是正,+x,是负,-x;

为偶数:那么使得绝对值最小的数。改变符号,如果正-x,负+x.

代码:

#include<bits/stdc++.h>
#define maxn 200010
#define mod 1000000007
#define ll long long
#define pb push_back
#define fs first
#define se second
using namespace std;
const int INF=1e9+7;

ll a[maxn];
pair<ll,int> p[maxn];

priority_queue<pair<ll,int>, vector<pair<ll,int> >, greater<pair<ll,int> > > q;

int ok=1;

int main()
{
    int n,k,x;
    scanf("%d%d%d",&n,&k,&x);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        if(a[i]<0) ok^=1;
        p[i].se=i;
        p[i].fs=abs(a[i]);
        q.push(p[i]);
    }
    while(k)
    {
        pair<ll,int> now=q.top();
        q.pop();
        if(ok)
        {
            if(a[now.se]>=0)
            {
                a[now.se]-=x;
                if(a[now.se]<0) ok^=1;
            }
            else
            {
                a[now.se]+=x;
                if(a[now.se]>=0) ok^=1;
            }
            now.fs=abs(a[now.se]);
            q.push(now);
        }
        else
        {
            if(a[now.se]>=0) a[now.se]+=x;
            else             a[now.se]-=x;
            now.fs=abs(a[now.se]);
            q.push(now);            
        }
        k--;
    }
    for(int i=1;i<=n;i++) printf("%lld ",a[i]);
}

 

以上是关于Codeforces Round #374 (Div. 2) D. Maxim and Array的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces Round #374(div 2)

Codeforces Round #374 (Div. 2)解题报告

Codeforces Round #374 (Div. 2)

Codeforces Round #374 (Div. 2)-C. Journey DP

Codeforces Round #374 (Div. 2) D. Maxim and Array

Codeforces Round #374 (Div. 2)-D Maxim and Array