UVA_10026

这个是一个贪心的题目首先按照fine/time降序排列,值相同的再按序号升序排列。

对于为什么贪心策略是这个样子的,我们不妨拿相邻的两个事件ab来说明一下。由于ab之后的事件是固定的,所以我们无论排成ab还是排成ba后面部分的损失都是固定的,那么损失的差别主要来源于究竟是排成ab还是排ba。排ab的损失为ta*fb,排ba的损失为tb*fa,那么如果ta*fb<tb*fa,我们就排成ab,这样可以得到fa/ta>fb/tb,推而广之,就得到了我们的贪心策略。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
double time[1010],fine[1010],b[1010];
int r[1010];
int cmp(const void *_p,const void *_q)
{
int *p=(int *)_p;
int *q=(int *)_q;
if(fabs(b[*p]-b[*q])<1e-6)
return *p-*q;
else if(b[*p]<b[*q])
return 1;
else
return -1;
}
int main()
{
int i,j,k,n,t,tt;
scanf("%d",&t);
for(tt=0;tt<t;tt++)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%lf%lf",&time[i],&fine[i]);
b[i]=fine[i]/time[i];
r[i]=i;
}
qsort(r,n,sizeof(r[0]),cmp);
if(tt)
printf("\n");
for(i=0;i<n;i++)
{
if(i)
printf(" ");
printf("%d",r[i]+1);
}
printf("\n");
}
return 0;
}


posted on 2011-09-21 12:26  Staginner  阅读(615)  评论(0编辑  收藏  举报