以后做的水题都会在这里发布
jzoj1443. 最小最大和
容易想到如下贪心策略:
将2个序列排序,每一次从a序列取头,b序列取尾,再将a序列的头和b序列的尾删除
但是这样子在n<=100000的情况下会tle
注意到所有数的权值<=100,于是使用桶记录即可
ps:因为一个睿智错误调了好久
#include<bits/stdc++.h> using namespace std; int x,y,a[110],b[110],n; int main(){ scanf("%d",&n); while(n--){ scanf("%d%d",&x,&y); a[x]++;b[y]++; int s=0,r=101,rs=0,ans=0; for(int i=1;i<=100;i++){ if(!a[i])continue; s+=a[i]; if(rs>=s){ if(b[r])ans=max(ans,i+r); continue; } while(r&&rs<s){ if(b[r]&&s-a[i]<rs)ans=max(ans,i+r); r--; rs+=b[r]; } if(b[r])ans=max(ans,i+r); } printf("%d\n",ans); } }