Luogu U18738
题意:有n个人来分工命题m个问题,给每道题一个难度值,每个人出一道或两道题,若人员充足,可以有一些人不出题。求在满足条件的方案中,
使得对于所出题目难度之和最大的那个人,这个难度之和最小。
思路:对这个序列排序,若命题人的数量大于题目数量,那么每个人可以只出一道题,那么答案肯定是序列中最大的那个值。
若不满足,则需要m-n个人来出两道题,那么采用贪心法,为使最后这个序列中的最大值是所有方案中最小的,那么我们需要使
1至(m-n)*2这个序列中的最大值最小,那么就从头尾取起即可,最后记得还要与序列中的最大值比较!
这题与Luogu1094有点类似。。。
#include<cstdio> #include<algorithm> #define maxn 200050 using namespace std; int a[maxn]; int read(){ int w=0;char c=getchar(); while(c<'0'||c>'9') c=getchar(); while(c>='0'&&c<='9') w=w*10+c-48,c=getchar(); return w; } int main(){ int n,m,y,i,ans=-2147483647; n=read();m=read(); for(i=1;i<=n;i++) a[i]=read(); sort(a+1,a+1+n); if(m>=n){ printf("%d",a[n]);return 0; } y=n-m; for(i=1;i<=y;i++){ ans=max(ans,a[i]+a[y*2-i+1]); } printf("%d",max(ans,a[n])); return 0; }