[ 题解 ] [ 贪心 ] 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 }

 

以上是关于[ 题解 ] [ 贪心 ] H. Roma and Changing Signs (待更名)的主要内容,如果未能解决你的问题,请参考以下文章

H. Twin Buildings(贪心&扫描线)

CodeForces 518E Arthur and Questions(贪心 + 思维)题解

Codeforces 803E--Roma and Poker (DP)

「题解」300iq Contest 2 H. Honorable Mention

第 2 届河北省大学生程序设计竞赛(河北省赛)-Problem H. 神殿-题解

主席树维护mex SG函数递推 Problem H. Cups and Beans 2017.8.11