装进肚子——求最大甜蜜值(利用数组的差值,java)

题意

题目链接:https://ac.nowcoder.com/acm/contest/19850/B

 自从ZZZZone吃完糖果后,他开始改吃巧克力了,他每天想吃n个巧克力增在甜蜜值,他决定早上吃K个巧克力,晚上吃n - K个巧克力,每个巧克力在早上吃和在晚上吃的甜蜜值是不一样的,他想让自己得到的甜蜜值最大,并想知道最大是多少。
请你编程帮助他。


Input


第一行包含两个数n,K表示每天要吃的巧克力数量和要在早上吃的数量。(n <= 100000, K <= n)
第二行包含n个整数Ai(1 <= i <= n) 表示个第i个巧克力在早上吃可得到的甜蜜值 (Ai <= 100000)
第三行包含n个整数Bi(1 <= i <= n) 表示个第i个巧克力在晚上吃可得到的甜蜜值 (Bi <= 100000)


Output

 输出仅一行包含一个整数表示ZZZZone能获得的最大甜蜜值。

Example Input

2 1
3 6
2 8

Example Output

11

#解析 :
 贪心的思想,选完早上的对应的晚上的值也能够确定,我们利用他们的差值最大来选。我们把晚上的值加起来,然后随机选(sum+=)k个差值,sum的值就相当于早上选了k个,晚上选了n-k个。如果想要这个值最大,只需要对差值数组排序,选最大的k个即可。

拓展:
 如果遇到有早中晚(a,b,c),或者更多的(a,b,c,d…m),数据保证a+b+c+…+m=n我们也可以用上面所讲的贪心思想解决问题
结构体差数组C有三种元素,kind,id,v,kind代表属于哪一个数组,id代表下标,v代表(a,b,c…m-1数组对最后一个数组m里面每个对应元素的差值),C的长度=sizsof(a,b,c…m-1)的和。
 最后: 对C根据v进行升序,然后sum+= 剩余的差值
需要注意的是:
 已经选过(id)的continue
 每个数组选完了之后,遇到次数组的值kind就continue
 循环一直持续到累计选完n-m个数,break


AC代码 - - -

#solution1

import java.util.*;
import java.io.*;
public class Main {
    static int mx = 100005;
    static int a[] = new int[mx],b[] = new int[mx];
    static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    static int ini() throws IOException {
        int x=0,f=1,c=in.read(); while(c<48||c>57){if(c==-1)return -1;c=in.read();}
        while(c>=48&&c<=57) {x=(x<<3)+(x<<1)+(c^48);c=in.read();}return x*f;
    }
    public static void main(String[] args) throws IOException {
        int n = ini(), k = ini(), t = 0, i = 0;
        long sum = 0;
        for(i = 1; i <= n; ++i) {
            a[i] = ini();
        }
        for(i = 1; i <= n; ++i) {
            t = ini();
            b[i] = a[i]-t;
            sum += t;
        }
        Arrays.sort(b,1,n+1);  
        for(i = n; i > n-k; --i) {
           sum += b[i];
        }
        System.out.printf("%d\n",sum);
    }
}

拓展:
#solution1

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值