[ 题解 ] [ 贪心 ] H. Roma and Changing Signs (待更名)
Posted kaidora
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[ 题解 ] [ 贪心 ] H. Roma and Changing Signs (待更名)相关的知识,希望对你有一定的参考价值。
http://codeforces.com/group/NVaJtLaLjS/contest/236618/problem/H
题意:
给出N个数字,包括正负数;以及数值K。
这个K表示给数字变换符号的次数,必须变换K次,同一个数可以反复翻转正负。
现在输出K次变换后所有数字的最大总和。
示例:
Input:
3 2 -1 -1 1
Output:
3
Input:
3 1 -1 -1 1
Output:
1
又是贪心。优先把变换机会给最小的负值,负值会变成很大的整数。
如果负值都变正数后还有变换机会,就不停变换最小的数好了。
最终就能得到最大的总和。
1 #include <cstdio> 2 #include <algorithm> 3 using namespace std; 4 int N=0,K=0; 5 int nums[100002]={0}; 6 int min=0; 7 int answer=0; 8 int main() 9 { 10 scanf("%d%d",&N,&K); 11 for(int n=1;n<=N;n++) 12 scanf("%d",nums+n); 13 sort(nums+1,nums+1+N); 14 for(int n=1;n<=N;n++) 15 { 16 if(K) 17 { 18 if(nums[n]<0) 19 { 20 nums[n]=-nums[n]; 21 K--; 22 } 23 else 24 { 25 K=K%2; 26 if(K) 27 { 28 sort(nums+1,nums+1+N); 29 nums[1]=-nums[1]; 30 K--; 31 } 32 } 33 } 34 else break; 35 } 36 if(K) 37 { 38 K=K%2; 39 if(K) 40 { 41 sort(nums+1,nums+1+N); 42 nums[1]=-nums[1]; 43 } 44 } 45 // for(int n=1;n<=N;n++) 46 // printf("%d,",nums[n]); 47 // puts(""); 48 for(int n=1;n<=N;n++) 49 answer+=nums[n]; 50 printf("%d ",answer); 51 return 0; 52 }
!-- @page>!-- @page>!-- @page>!-- @page>!-- @page>
以上是关于[ 题解 ] [ 贪心 ] H. Roma and Changing Signs (待更名)的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces 518E Arthur and Questions(贪心 + 思维)题解
Codeforces 803E--Roma and Poker (DP)
「题解」300iq Contest 2 H. Honorable Mention