码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-10-22 20:49:51      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:push   模拟   print   strong   ace   codeforce   bsp   color   pop   

题解:

模拟题

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

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

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

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

为奇数:那么绝对值最小的数,如果是正,+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

标签:push   模拟   print   strong   ace   codeforce   bsp   color   pop   

原文地址:http://www.cnblogs.com/byene/p/5988172.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!