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

 

转载于:https://www.cnblogs.com/Kaidora/p/10527490.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值