2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > codeforces1379C Choosing flowers

codeforces1379C Choosing flowers

时间:2023-10-23 09:47:26

相关推荐

codeforces1379C Choosing flowers

/contest/1379/problem/C

按a拍个序,然后枚举每种花

只多拿这一种

剩下的大于bi的aj的必须拿,因为可以通过少拿一个bi来换一个更大的aj,这样就可以把多拿每种花的最优情况求出来

注意处理一下ai>bi情况,这个时候数量有点小变化

#include<bits/stdc++.h>using namespace std;typedef long long ll;const int maxl=3e5+10;int cas,k,cnt,tot;ll n,m,ans;struct node{ll a,b;bool operator < (const node &y)const{if(a==y.a)return b<y.b;return a<y.a;}}aa[maxl];ll suma[maxl],a[maxl],b[maxl];char s[maxl];bool in[maxl]; inline void prework(){scanf("%lld%lld",&n,&m);for(int i=1;i<=m;i++)scanf("%lld%lld",&aa[i].a,&aa[i].b);sort(aa+1,aa+1+m);for(int i=1;i<=m;i++){a[i]=aa[i].a,b[i]=aa[i].b;suma[i]=suma[i-1]+a[i];}} inline void mainwork(){if(n>m)ans=suma[m];elseans=suma[n];int ind,len;ll tmp;for(int i=1;i<=m;i++){ind=upper_bound(a+1,a+1+m,b[i])-a;if(ind<=i){len=min(m-ind+1,n);tmp=suma[m]-suma[m-len]+b[i]*(n-len);}else{len=min(m-ind+1,n-1);tmp=suma[m]-suma[m-len]+a[i]+b[i]*(n-len-1);}ans=max(ans,tmp);}}inline void print(){printf("%lld\n",ans);}int main(){int t=1;scanf("%d",&t);for(cas=1;cas<=t;cas++){prework();mainwork();print();}return 0;}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。