题目链接:传送门
思路:要求最后求出的时间尽可能的小,一开始我只想到了用排序分别讨论ai和bi的大小,
后来发现结果与两者都有关系,然后……就没做出来。
后来看了题解,发现如果只要让ai/bi尽可能大,就能保证所得到的时间是最小的,让ai/bi
降序排序,然后贪心即可。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int maxn = 100100+10; typedef long long LL; struct Node{ LL ai,bi; }cur[maxn]; bool cmp(Node a,Node b) { return 1.0*a.bi/a.ai>1.0*b.bi/b.ai; } int main(void) { int n,i; while(~scanf("%d",&n)) { LL tp=0; for(i=0;i<n;i++) scanf("%lld%lld",&cur[i].ai,&cur[i].bi),tp+=cur[i].bi; sort(cur,cur+n,cmp); LL ans=0; for(i=0;i<n;i++) { tp=tp-cur[i].bi; ans+=tp*cur[i].ai; } printf("%lld ",ans); } return 0; }