1 条题解
-
0
自动搬运
来自洛谷,原作者为

WaterSun
ʕ̯•͡˔•̯᷅ʔʕ̯•͡˔•̯᷅ʔʕ̯•͡˔•̯᷅ʔ | /cy | 爱你搬运于
2025-08-24 22:25:14,当前版本为作者最后更新于2024-08-12 14:28:11,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
怎么没有人证明贪心啊。
思路
显然要按 的大小关系分类:
- :
假令有两对数 ,且 。
-
如果 。则按照 12 的顺序,将带来 的花费;而按照 21 的顺序,将带来 的花费。所以按照 12 顺序更优。
-
如果 。则按照 12 的顺序,将带来 的花费;而按照 21 的顺序,将带来 的花费。因为 ,所以按照 12 顺序更优。
综上,此时按照 从小往大排序正确。
- :
假令有两对数 ,且 :
-
如果 。则按照 12 的顺序,将带来 的花费;而按照 21 的顺序,将带来 的花费。因为 ,所以按照 12 顺序更优。
-
如果 。则按照 12 的顺序,将带来 的花费;而按照 21 的顺序,将带来 。因为 ,所以按照 12 顺序更优。
综上,此时按照 从大往小排序正确。
Code
#include <bits/stdc++.h> #define re register #define fst first #define snd second #define int long long using namespace std; typedef pair<int,int> pii; const int N = 1e6 + 10; int n,ans,cnt; vector<pii> A,B; inline int read(){ int r = 0,w = 1; char c = getchar(); while (c < '0' || c > '9'){ if (c == '-') w = -1; c = getchar(); } while (c >= '0' && c <= '9'){ r = (r << 3) + (r << 1) + (c ^ 48); c = getchar(); } return r * w; } signed main(){ n = read(); for (re int i = 1,a,b;i <= n;i++){ a = read(),b = read(); if (a <= b) A.push_back({a,b}); else B.push_back({a,b}); } sort(A.begin(),A.end(),[](const pii &a,const pii &b){ if (a.fst != b.fst) return a.fst < b.fst; else return a.snd > b.snd; }); sort(B.begin(),B.end(),[](const pii &a,const pii &b){ if (a.snd != b.snd) return a.snd > b.snd; else return a.fst < b.fst; }); for (pii p:A){ if (cnt >= p.fst){ cnt -= p.fst; cnt += p.snd; } else{ ans += (p.fst - cnt); cnt = p.snd; } } for (pii p:B){ if (cnt >= p.fst){ cnt -= p.fst; cnt += p.snd; } else{ ans += (p.fst - cnt); cnt = p.snd; } } printf("%lld",ans); return 0; }
- 1
信息
- ID
- 6075
- 时间
- 5000ms
- 内存
- 512MiB
- 难度
- 5
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者