[ICPC 2024 Kunming I] 金牌题解
题目描述
真是忙碌的一周!这个周末,将会有 n 场程序设竞赛同时进行。
每场竞赛将会从每 k 支参加该竞赛的队伍中颁发一枚金牌。也就是说,如果有 t 支队伍参加竞赛,将会颁发 ⌊kt⌋ 枚金牌,其中 ⌊x⌋ 是不超过 x 的最大整数。目前第 i 场竞赛有 ai 支队伍参加。
堡堡是一所大学的教练,该大学有 m 支队伍,并且他还没有决定每支队伍应该参加哪场竞赛。请帮助他为每支队伍分配一场竞赛,使得所有竞赛颁发的金牌总数最多。
输入格式
有多组测试数据。第一行输入一个整数 T(1≤T≤100)表示测试数据组数,对于每组测试数据:
第一行输入两个整数 n 和 k(1≤n≤100,1≤k≤109),表示竞赛的数量和金牌的比例。
第二行输入 n 个整数 a1,a2,⋯,an(1≤ai≤109),其中 ai 表示目前有几支队伍参加第 i 场竞赛。
第三行输入一个整数 m(1≤m≤109),表示您需要为多少支队伍安排竞赛。
输出格式
每组数据输出一行一个整数,表示所有竞赛最多一共颁发多少金牌。
输入输出样例
输入 #1复制
2 3 10 239 141 526 6 2 1 300 100 1000
输出 #1复制
91 1400
说明/提示
对于第一组样例数据,派 2 支队伍去第 1 场竞赛,4 支队伍去第 3 场竞赛。金牌总数为 ⌊10239+2⌋+⌊10141+0⌋+⌊10526+4⌋=24+14+53=91。
思路
贪心,最小代价。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long t,n,k,a[100005],m,b[100005],lk=0;
int main(){
cin>>t;
while(t--){
cin>>n>>k;
lk=0;
for(int i=1;i<=n;i++){
cin>>a[i];
lk+=a[i]/k;
b[i]=k-a[i]%k;
}
cin>>m;
sort(b+1,b+n+1);
for(int i=1;i<=n;i++){
if(m>=b[i]){
lk++;
m-=b[i];
}
else{
m=0;
break;
}
}
cout<<lk+m/k<<endl;
}
return 0;
}

浙公网安备 33010602011771号