第三届山西省程序设计大赛
灰哥的烦恼
时间限制: C/C++ 1000ms; Java 2000ms 内存限制: 65535KB
问题描述
作为上兰帝国ACM中的首席外交官,灰哥可谓是圈内dalao,每日处理各种复杂的外交事务,为了更好的和圈内其他dalao谈笑风生,灰哥加入了很多蒟(菊)蒻(苣)群,但由于群的数量太多,灰哥不能很快的答复信息,于是灰哥准备将各个群设定一个等级分,每个群的等级分互不相同。
但是灰哥的这个决定被很多群主得知,所以每个群主纷纷要求灰哥将自己的群的等级分提升到某个数值或某个数值以上,即第i个群主要求第i个群的等级分最少为a[i].灰哥非常苦恼,他不想等级分的总和超过k。他想要知道是否存在一种方案,能满足大家的需求。
输入描述
输入包括两行
第一行两个数n(1<=n<=1e6),k(1<=k<=1e9),n代表群的总数,k代表等级分总和的最大值
第二行有n个数,第i个数a[i]表示第i个群的最低等级分(1<=a[i]<=1e9)
输出描述
如果存在满足的组合请输出最小的等级分和,否则输出“Dalao de yao qiu tai gao le , QAQ”(不包括引号)。
样例输入
3 10
1 1 1
样例输出
6
来源
第三届山西省大学生程序设计大赛
提示
三个群要求的最低等级都是一,且群主们要求各自等级互不相等,所以分别定义三个群的等级为1,2,3即可,总和为6.
注意数据范围 AC代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1000000+10;
int a[maxn];
int main()
{
int n,k;
long long minn=0;
long long ans=0;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
for(int i=0;i<n;i++)
{
if(a[i]>minn)
{
ans+=a[i];
minn=a[i];
}
else if(a[i]<=minn)
{
minn++;
ans+=minn;
}
//cout<<ans<<endl;
}
if(ans<=k)
printf("%lld\n",ans) ;
else
printf("Dalao de yao qiu tai gao le , QAQ\n");
//system("pause");
return 0;
}