也是简单题。
用高中老师讲的排序不等式再加上一点贪心的思想就解决了。days/cost最小的shoes应该先做,只有这样才能保证支出最少。。。越来越觉得数学有用啊。。以前感受都不是这么深,做了acm才觉得数学太伟大了。
开始还不太确定这样排序是不是对的,因为我还每想出来怎么证明,但试了下也找不到反例,就先写了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define MAX 1010
using namespace std;
struct element
{
int index;
double days,cost,value;
}ele[MAX];
int cmp(const void *p,const void *q)
{
if(((element *)p)->value>((element *)q)->value)
return 1;
else if(((element *)p)->value==((element *)q)->value)
{
if(((element *)p)->index<((element *)q)->index)
return -1;
else
return 1;
}
else
return -1;
}
int main()
{
int t,n,i,j;
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%lf %lf",&ele[i].days,&ele[i].cost);
ele[i].index=i+1;
ele[i].value=ele[i].days/ele[i].cost;
}
qsort(ele,n,sizeof(ele[0]),cmp);
for(i=0;i<n;i++)
{
printf("%d",ele[i].index);
if(i!=n-1)
printf(" ");
}
puts("");
if(t)
puts("");
}
return 0;
}