zoukankan      html  css  js  c++  java
  • 洛谷 P1842 [USACO05NOV]奶牛玩杂技(排序贪心)

    题目链接:https://www.luogu.com.cn/problem/P1842

    贪心证明:

    假设上面所有奶牛的总重为W,当前要放a、b两头奶牛,假设Wa+Sa<Wb+Sb

    (1)a在b的上面:则a:W-Sa,b:W+Wa-Sb

    (2)b在a的上面:则b:W-Sb,a:W+Wb-Sa

    同时减去W得-Sa,Wa-Sb,-Sb,Wb-Sa。

    因为-Sa<Wb-Sa,-Sb<Wa-Sb,所以只考虑Wa-Sb与Wb-Sa的大小关系。

    若Wa-Sb<Wb-Sa,选a在b上面的方案,此时Wa+Sa<Wb+Sb,即上面的W+S小。

    若Wa-Sb>Wb-Sa,选b在a上面的方案,此时Wa+Sa>Wb+Sb,即上面的W+S小。

    综上所述,只需要按W+S排序,小的放在上面是最优的。其中注意一个细节:第一个奶牛的挤压程度为0-S[1]。

    AC代码:

     1 #include<cstdio>
     2 #include<iostream>
     3 #include<cmath>
     4 #include<algorithm>
     5 using namespace std;
     6 int n;
     7 int ans=-2000000000,sum;
     8 struct node{
     9     int w,s,d;
    10 }o[100005];
    11 bool cmp(node a,node b){
    12     return a.d<b.d;
    13 }
    14 int main(){
    15     scanf("%d",&n);
    16     for(int i=1;i<=n;i++){
    17         scanf("%d%d",&o[i].w,&o[i].s);
    18         o[i].d=o[i].w+o[i].s;
    19     }
    20     sort(o+1,o+n+1,cmp);
    21     for(int i=1;i<=n;i++){
    22         ans=max(sum-o[i].s,ans);
    23         sum+=o[i].w;
    24     }
    25     printf("%d",ans);
    26     return 0;
    27 }
    AC代码
  • 相关阅读:
    [haoi2015]T1
    [haoi2014]走出金字塔
    [haoi2014]穿越封锁线
    [haoi2014]遥感监测
    [haoi2012]高速公路
    [haoi2012]容易题
    [haoi2008]排名系统
    【bzoj1014】[JSOI2008]火星人prefix
    0916解题报告
    生成树计数问题
  • 原文地址:https://www.cnblogs.com/New-ljx/p/13416180.html
Copyright © 2011-2022 走看看