[ 题解 ] [ 贪心 ] 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\n",answer);
51     return 0;
52 }

猜你喜欢

转载自www.cnblogs.com/Kaidora/p/10527490.html