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

 

posted @ 2011-08-04 21:53  Lxsec  阅读(232)  评论(0编辑  收藏  举报