题意
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;
}