Luogu U18738

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;
}
Let's Splay

 

posted @ 2018-01-29 20:13  Konnyaku  阅读(92)  评论(0编辑  收藏  举报