原题链接
题意
n个人,k件毛衣,每个人都有一个编号,每人k/n件毛衣,剩余x件,就依次给编号小于等于第x大的编号的人一人一件。
要求最后要按照编号给出的顺序来输出每个人有几件毛衣。
思路
用结构体存编号,毛衣数,和出现次序,然后每个人的毛衣件数+=(k/n),剩余k%n。那么就让结构体按照编号从小到大的顺序排,然后循环i=k%x,i>0;i–;然后每个人的毛衣件数++。然后再按照出现顺序来进行结构体排序,就是题目给的顺序,排完之后再依次输出即可。
代码
#include<bits/stdc++.h>
#define int long long
using namespace std;const int N = 200005;struct name{
int id;//编号int sum;//毛衣数 int flag;//出现次序
}num[N];bool cmp(name a, name b) //编号从小到大排
{
return a.id < b.id;
}bool cmp1(name a, name b) //出现次序排序
{
return a.flag < b.flag;
} signed main()
{
int n, k;//n个人,k件毛衣 cin >> n >> k;for(int i = 0; i < n; i ++ ){
cin >> num[i].id;num[i].sum += (k / n);num[i].flag = i;//记录出现次序 }int cnt = k % n;sort(num, num + n, cmp); //按编号排序 while(cnt --){
num[cnt].sum ++;}sort(num, num + n, cmp1); //按出现次序排序 for(int i = 0; i < n; i ++){
cout << num[i].sum << endl;}return 0;
}