HDU 3866 Moonfang's Birthday
今天的比赛题!本来在最后面的时候扫到这题!感觉能出, 不够着实让我纠结了很久啊!最终还是没出来!
大意就是大家给MOONfang买个仙五的礼物! 大家的钱又给的不一样多!就求让大家尽量公平的出!少得少出,多的多出。
基本思想就是和平均值比较!能出的钱少的人先出,少于平均值的就都拿出来,然后人数就减一,又求平均值,够平均值的就出平均值。
直到最后一个人全部付完!今天就是郁闷的CMP函数写错了! 一直WA!
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
usingnamespace std;
struct node
{
int v,y;
};
node a[10010];
int sum[10010];
int cmp(node a,node b)
{
if(a.v!=b.v) // 就是这里没考虑清楚! 好好体会体会!
return a.v<b.v;
return a.y>b.y;
}
int main()
{
int t,n,i,j;
int pre;
scanf("%d",&t);
for(j=0;j<t;j++)
{
scanf("%d%d",&pre,&n);
for(i=0;i<n;i++)
{
scanf("%d",&a[i].v);
a[i].y=i;
}
memset(sum,0,sizeof(sum));
sort(a,a+n,cmp);
int k=n;
for(i=0;i<n;i++) //全部人都要出钱 没钱少出有钱多出,从最少的开会
{
if(a[i].v<=pre/k)
sum[a[i].y]=a[i].v;
else
if(a[i].v>pre/k)
sum[a[i].y]=pre/k;
k--;
pre-=sum[a[i].y];
}
if(pre>0)
printf("IMPOSSIBLE");
else
{
printf("%d",sum[0]);
for(i=1;i<n;i++)
printf(" %d",sum[i]);
}
printf("\n");
}
return0;
}