牛客——训练部队【贪心】

[编程题]训练部队

  • 热度指数:943 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

小牛牛是牛牛王国的将军,为了训练出精锐的部队,他会对新兵进行训练。部队进入了n个新兵,每个新兵有一个战斗力值和潜力值,当两个新兵进行决斗时,总是战斗力值高的获胜。获胜的新兵的战斗力值就会变成对手的潜力值 + 自己的战斗力值 - 对手的战斗力值。败者将会被淘汰。若两者战斗力值一样,则会同归于尽,双双被淘汰(除了考察的那个新兵之外,其他新兵之间不会发生战斗) 。小牛牛想知道通过互相决斗之后新兵中战斗力值+潜力值最高的一个可能达到多少,你能帮助小牛牛将军求出来吗?

输入描述:

输入包括n+1行,第一行包括一个整数n(1 ≤ n ≤ 10^5);
接下来的n行,每行两个整数x和y(1 ≤ x,y ≤ 10^9)

输出描述:

输出一个整数,表示新兵中战斗力值+潜力值最高的一个能达到多少。

示例1

输入

2
1 2
2 1

输出

4

解析见注释

import java.util.Scanner;

/**
 * 不妨设潜力值>攻击值的士兵记为增值士兵,记增值总和为gain
 * 接着就是选择士兵,有两种可能,一种是增值士兵,一种不是
 * - 若为增值士兵:gain - (潜力值 - 攻击值) + (潜力值 + 攻击值) = gain + 2 * 攻击值
 * - 若为其他士兵:gain + (潜力值 + 攻击值)
 * 由于gain的值是一定的,所有有两种选择方案:
 * 1. 选择增值士兵攻击力最大的士兵,其攻击力记为maxBat
 * 2. 选择其他士兵(潜力值 + 攻击值)和最大的士兵maxSoilder
 *
 * 我们知道增值士兵攻击力最大的士兵一定能把所有增值士兵干掉
 * 若maxSoilder.bat + pot > 2 * maxBat, 其他士兵中(潜力值 + 攻击值)最大的士兵同样也可以将所有增值士兵干掉。
 * 由于其他士兵bat > pot, => bat > (bat + pot) / 2 > maxBat,所以可以将所以增值士兵干掉。
 *
 */
public class Main {
    public static class Soilder{
        long bat;
        long pot;
        public long sum(){
            return bat + pot;
        }
    }
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        Soilder[] ss = new Soilder[n];
        Soilder maxSoilder = null;
        long maxBat = 0;
        long gain = 0;
        for (int i = 0; i < n; i++) {
            ss[i] = new Soilder();
            ss[i].bat = sc.nextLong();
            ss[i].pot = sc.nextLong();
            // 选出增值士兵
            if(ss[i].bat < ss[i].pot){
                gain += ss[i].pot - ss[i].bat;
                maxBat = Long.max(maxBat, ss[i].bat);
            }else{
                maxSoilder = maxSoilder == null ? ss[i] : (maxSoilder.sum() > ss[i].sum() ? maxSoilder : ss[i]);
            }
        }
        System.out.println(gain + (Long.max(2 * maxBat, maxSoilder.sum())));
    }

}

链接:https://www.nowcoder.com/questionTerminal/79190c8e6202414bad33d6e287b61f3d
来源:牛客网

你可能感兴趣的:(#,牛客)