题解:
模拟题
虽然是个大模拟题,但是很考验思维的活跃度。
刚开始做的时候知道怎么做。但是自己的想法情况很多。分类枚举总是把自己混淆
这题教会我的是,要仔细思考分类的方式
这个题。根据枚举负数的个数奇偶来判断
为奇数:那么绝对值最小的数,如果是正,+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]); }
时间: 2024-11-05 03:29:36