首页 > 代码库 > CodeForces 721D Maxim and Array
CodeForces 721D Maxim and Array
题意:给出n个数,k次机会,每次机会可以使得任意一个数字减少或者加上x,问使得最后的乘积最小的n个数,每个数是多少。
分析:贪心思路是每次取出绝对值最小的一个数,判断乘积的符号以及这个数的符号来做出加或者减的操作。
具体见代码:
1 #include <stdio.h> 2 #include <algorithm> 3 #include <string.h> 4 #include <iostream> 5 #include <queue> 6 #include <math.h> 7 using namespace std; 8 9 const int N = 200000 + 50;10 typedef long long ll;11 12 ll aabs(ll x) {return x<0 ? -x : x;}13 14 struct node15 {16 ll num;17 int id;18 bool operator < (const node & temp) const19 {20 return aabs(num) > aabs(temp.num);21 }22 };23 24 ll a[N];25 ll n,k,x;26 27 int main()28 {29 cin >> n >> k >> x;30 int sign = 1;31 priority_queue<node> Q;32 for(int i=1;i<=n;i++)33 {34 scanf("%I64d",a+i);35 if(a[i] < 0) sign = -sign;36 Q.push((node){a[i],i});37 }38 while(k--)39 {40 node temp = Q.top();Q.pop();41 if(a[temp.id] < 0)42 {43 if(sign == -1) a[temp.id] -= x;44 else a[temp.id] += x;45 if(a[temp.id] >= 0) sign = -sign;46 }47 else48 {49 if(sign == -1) a[temp.id] += x;50 else a[temp.id] -= x;51 if(a[temp.id] < 0) sign = -sign;52 }53 Q.push((node){a[temp.id],temp.id});54 }55 for(int i=1;i<=n;i++)56 {57 printf("%I64d%c",a[i],i==n?‘\n‘:‘ ‘);58 }59 }
顺便回顾一下,优先队列是默认的每次弹出优先级最大的元素(默认less),,好久没用优先队列都忘了= =。。
CodeForces 721D Maxim and Array
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。