题意:一个鞋匠做鞋,每个鞋都有制作的时间,和延迟制作的处罚,问怎样的顺序才能使处罚达到最低。多种答案的情况下取字典序最小。
思路:贪心地去做,每次优先做S/t最大的,同样的情况下,先做标号最小的,保证字典序最小。
AC代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct node
{
int x,y,num;
}box[10010];
bool cmp(node a,node b)
{
if(a.y*b.x==a.x*b.y)
return a.num<b.num;
return a.y*b.x>a.x*b.y;
}
int T,t,n;
int main()
{
int i,j,k;
scanf("%d",&T);
for(t=1;t<=T;t++)
{
scanf("%d",&n);
for(i=1;i<=n;i++)
{
scanf("%d%d",&box[i].x,&box[i].y);
box[i].num=i;
}
sort(box+1,box+1+n,cmp);
if(t!=1)
printf("\n");
printf("%d",box[1].num);
for(i=2;i<=n;i++)
printf(" %d",box[i].num);
printf("\n");
}
}