CF1379C.Choosing Flowers(二分)
阿新 • • 發佈:2020-07-20
給出m種花,對於每一種花,購買第一束可以帶來ai的開心值,之後買第二束、第三束會增加bi...你可以購買n種花,詢問怎麼設計購買方案,使得總開心值最大。
#include<bits/stdc++.h> using namespace std; const int maxn=2e5+100; typedef long long ll; int n,m; struct node { ll a,b; bool operator < (const node &r) const { return a>r.a; } }Node[maxn]; ll pre[maxn];int main () { int t; scanf("%d",&t); while (t--) { scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { scanf("%d%d",&Node[i].a,&Node[i].b); } sort(Node+1,Node+m+1); for (int i=1;i<=m;i++) pre[i]=pre[i-1]+Node[i].a; ll ans=0; for (int i=1;i<=m;i++) { int l=1,r=m; int tt=0; while (l<=r) { int mid=(l+r)>>1; if (Node[mid].a>=Node[i].b) l=mid+1,tt=mid; else r=mid-1; }if (tt>=n) ans=max(ans,pre[n]); else { if (tt>=i) ans=max(ans,pre[tt]+Node[i].b*(n-tt)); else ans=max(ans,pre[tt]+Node[i].a+Node[i].b*(n-tt-1)); } } printf("%lld\n",ans); } }