洛谷 1842 [USACO05NOV]奶牛玩杂技【贪心】
【题意】
有N只奶牛,要摞在一起。
每只奶牛有重量wi和体力值si
每只奶牛的压扁值为它上面的奶牛的重量w之和-它自己的体力值si
使最大的压扁值最小。
【题解】
贪心,构造排序的compare函数即可。
假设有两只相邻的奶牛i和j,
i在j上的总压扁值是 max( a+Wi-Sj, a-Si), 其中a是他们上面的奶牛的质量。
j在i上的总压扁值是 max( a+Wj-Si, a-Sj).
比较这两个值的大小来决定i, j的上下关系即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include<cstdio> #include<cstring> #include<algorithm> #define LL long long #define N 500010 using namespace std; int n; LL ans=-2e9,sum; struct rec{ int w,s; }a[N]; inline int read(){ int k=0,f=1; char c= getchar (); while (c< '0' ||c> '9' )c== '-' &&(f=-1),c= getchar (); while ( '0' <=c&&c<= '9' )k=k*10+c- '0' ,c= getchar (); return k*f; } inline bool cmp(rec x,rec y){ int xabove=max(x.w-y.s,-x.s); int yabove=max(y.w-x.s,-y.s); return xabove<yabove; } int main(){ n=read(); for ( int i=0;i<n;i++) a[i].w=read(), a[i].s=read(); sort(a,a+n,cmp); for ( int i=0;i<n;i++){ ans=max(ans, sum-a[i].s); sum+=a[i].w; } printf ( "%lld\n" ,ans); return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 为什么 .NET8线程池 容易引发线程饥饿
· golang自带的死锁检测并非银弹
· 如何做好软件架构师
· 记录一次线上服务OOM排查
· Linux实时系统Xenomai宕机问题的深度定位过程
· 2025年广告第一单,试试这款永久免费的开源BI工具
· 为什么 .NET8线程池 容易引发线程饥饿
· 场景题:假设有40亿QQ号,但只有1G内存,如何实现去重?
· 在 .NET 中使用 Tesseract 识别图片文字
· .NET 响应式编程 System.Reactive 系列文章(一):基础概念