Description
It's Moonfang's birthday,and his friends decided to buy him a copy of XianJianQiXiaZhuan V.
Since some of friends have more money available than others, nobody has to pay more than he can afford. Every contribution will be a multiple of 1 cent,i.e.,nobody can pay fractions of a cent.
Everybody writes down the maxumum amount he is able to contribute. Taking into account these maximum amounts from everybody, your task is to share the cost of the present as fairly as possible. That means, you minimize the largest distance of the contributions to 1/n-th of the total cost.
In case of a tie, minimize the second largest distance, and so on. Since the smallest unit of contribution is 1 cent, there might be more than one possible division of the cost. In that case, persons with a higher maximum amount pay more. If there is still ambiguity, those who come first in the list pay more.
Since you bought the present, it is your task to figure out how much everybody has to pay.
Since some of friends have more money available than others, nobody has to pay more than he can afford. Every contribution will be a multiple of 1 cent,i.e.,nobody can pay fractions of a cent.
Everybody writes down the maxumum amount he is able to contribute. Taking into account these maximum amounts from everybody, your task is to share the cost of the present as fairly as possible. That means, you minimize the largest distance of the contributions to 1/n-th of the total cost.
In case of a tie, minimize the second largest distance, and so on. Since the smallest unit of contribution is 1 cent, there might be more than one possible division of the cost. In that case, persons with a higher maximum amount pay more. If there is still ambiguity, those who come first in the list pay more.
Since you bought the present, it is your task to figure out how much everybody has to pay.
Input
On the first line a positive integer: the number of test cases, at most 200. After that per test case:
- One line with two integers p and n: the price of the present in cents (1 ≤ p ≤ 1 000 000) and the number of people (2 ≤ n ≤ 10000) who contribute to the present (including you).
- One line with n integers ai (1 ≤ ai ≤ 1 000 000), where ai is the maximum amount, in cents, that the i-th person on the list is able to contribute.
Output
Per test case:
- One line with n integers: the amounts each person has to contribute according to the scheme. If the total cost cannot be divided according to the above rules, the line must contain "IMPOSSIBLE" instead.
Sample Input
3 20 4 10 10 4 4 7 3 1 1 4 34 5 9 8 9 9 4
Sample Output
6 6 4 4 IMPOSSIBLE 8 7 8 7 4
一群人聚会,有花费总钱数,有每个人有的钱数,让你计算在保证出钱最多的人跟最小的人差值最小的情况下,每个人应该出多少钱。
思路:先排序,计算每个人应该平均付多少per(时刻变化的),看钱数最少的人如果他拥有的钱数少于per,那就把自己的钱全部拿出来,然后人数少一个,继续计算剩下的人每个人应该拿出多少per,每次拿出钱的人记录他的位置与拿出的钱数,最后顺序输出就行了。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <stack>
#include <vector>
#include <queue>
#include <iostream>
#define _LL __int64
using namespace std;
struct node
{
int p;
int index;
}a[100005];
int cmp(node a,node b)
{
if(a.p==b.p)
return a.index > b.index;
return a.p < b.p;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int b[100000];
int ps,n;
long long z=0;
scanf("%d%d",&ps,&n);
for(int i = 1;i <= n;i++)
{
scanf("%d",&a[i].p);
a[i].index=i;
z+=a[i].p;
}
if(z < ps)
{
cout<<"IMPOSSIBLE"<<endl;
continue;
}
sort(a+1,a+n+1,cmp);
int pop=n;
for(int i = 1;i <= n;i++)
{
int x=ps/pop;
if(a[i].p < x)
{
ps-=a[i].p;
b[a[i].index]=a[i].p;
}
else
{
b[a[i].index]=x;
ps-=x;
}
pop--;
}
for(int i = 1;i <= n;i++)
{
if(i >= 2)
cout<<" ";
cout<<b[i];
}
cout<<endl;
}
return 0;
}