题目
羽裳有n个数,她想知道前k大的数的和是多少
输入n,k代表有n个数,求前k大的和,之后输入n个数,第i个数为a[i] 1<=n<=10000000(1e7) 1<=k<1000 对任意的i 1<=a[i]<=100000(1e5)
我的代码
#include <bits/stdc++.h>
using namespace std;
int a[100001];
int main()
{
ios::sync_with_stdio(false);
int n,m,x,i,y,imax=0,sum=0,cnt=0;
cin>>n>>m;
for(i=0; i<n; i++)
{
cin>>x;
a[x]++;
if(x>imax)
imax=x;
}
for(i=imax; i>0; i--)
{
if(a[i]!=0)
{
sum+=i*a[i];
cnt+=a[i];
y=i;
}
if(cnt>=m)
break;
}
if(cnt>=m)
sum-=i*(cnt-m);
cout<<sum<<endl;
}
反思
对于数据量较大,且大于数据的值(小于1e7)的排序,可以考虑采用桶排序
在K值求取问题上记得,记得当cnt大于k情况的处理