爱站网长尾关键词挖掘工具电脑版,广州网站建设 讯度网络,绚丽的网站,关于网站集约化建设公函耍杂技的牛
农民约翰的N头奶牛#xff08;编号为1…N#xff09;计划逃跑并加入马戏团#xff0c;为此它们决定练习表演杂技。
奶牛们不是非常有创意#xff0c;只提出了一个杂技表演#xff1a;
叠罗汉#xff0c;表演时#xff0c;奶牛们站在彼此的身上#xff0c…耍杂技的牛
农民约翰的N头奶牛编号为1…N计划逃跑并加入马戏团为此它们决定练习表演杂技。
奶牛们不是非常有创意只提出了一个杂技表演
叠罗汉表演时奶牛们站在彼此的身上形成一个高高的垂直堆叠。
奶牛们正在试图找到自己在这个堆叠中应该所处的位置顺序。
这N头奶牛中的每一头都有着自己的重量Wi以及自己的强壮程度Si。
一头牛只撑不住的可能性取决于它头上所有牛的总重量不包括它自己减去它的身体强壮程度的值现在称该数值为风险值风险值越大这只牛撑不住的可能性越高。
您的任务是确定奶牛的排序使得所有奶牛的风险值中的最大值尽可能的小。
输入格式 第一行输入整数N表示奶牛数量。
接下来N行每行输入两个整数表示牛的重量和强壮程度第i行表示第i头牛的重量Wi以及它的强壮程度Si。
输出格式 输出一个整数表示最大风险值的最小可能值。
数据范围 1≤N≤50000, 1≤Wi≤10,000, 1≤Si≤1,000,000,000 输入样例 3 10 3 2 5 3 3 输出样例 2 思路
贪心O(nlogn)
与国王游戏的贪心策略相似 我们先分析 每头牛的危险值 他前面牛的w(重量值)之和 - 自身的s(强壮值) 要使每头牛的危险值最小根据贪心思想
自身w值越大应该放到底部即减小上述式中的被减数 自身s值越大应该放到底部即增大上述式中的减数
所以先 假设出一种贪心做法 每头牛的(w s)值越大应该排在后面即升序排序(题见多了可能就会有这种题感)。
接下来进行图解证明 交换前后其他牛的危险值不变
i之前的牛并不涉及牛i与i1的重量值 i1之后的牛只涉及到牛i与i1重量值的和
所以分析交换前后最大的危险值即可。 我们只需要找到 交换前这俩牛马的危险值的最大值 交换后该牛马的危险值的最大值的条件 ,只要证明在该条件下这四个值的最大值如果是交换后的即可。
现在我们来比较一下
Wa -Si 1 Wa Wi)- Si1Wa Wi 1 - Si) Wa - Si)
排除俩个再比较 Wa Wi 1 - Si) 和Wa Wi)- Si1
也就是比较W(i) - S(i 1)交换前 和Wi 1) - Si交换后
如果交换前危险值 交换后危险值
W(i) - S(i 1)交换前 Wi 1) - Si交换后
也就是 Wi Si) W(i 1) S (i 1)
如果交换前危险值 交换后危险值
W(i) - S(i 1)交换前 Wi 1) - Si交换后
也就是 Wi Si) W(i 1) S (i 1)
所以得到做法: 按每头牛的 w s 进行排序,
当存在逆序时就进行交换(即升序排序)
import java.util.*;
public class Main {public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();Pair[] pairs new Pair[n];for(int i 0; i n; i ) {int w sc.nextInt();int s sc.nextInt();pairs[i] new Pair(w, s);}Arrays.sort(pairs, 0, n);int max Integer.MIN_VALUE;int w 0;for(int i 0; i n; i ) {int x w - pairs[i].v;if(x max) max x;w pairs[i].w; }System.out.println(max);}
}
class Pair implements ComparablePair{
int w;int v;public Pair(int w, int v) {this.w w;this.v v;}public int compareTo(Pair o){return Integer.compare(w v, o.w o.v);}}