1. 程式人生 > 實用技巧 >CF1379C.Choosing Flowers(二分)

CF1379C.Choosing Flowers(二分)

給出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); } }