题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=967
题目:附件
题意:一个工匠有多个任务要做,每个工作需要花费一定的时间t,但是耽误一天要交一定的罚金f,安排工作顺序使得总罚金最少。
题解:贪心。假设有 i 和 j 两件工作要做,分别有ti,fi,tj,fj,先做 i 的罚金是 ti*fj,先做j的罚金是 tj*fi。假设 ti*fj<tj*fi, 等价于 fi/ti>fj
/tj.所以应该先做 f/t 更大的工作可以是的罚金最少。参考:
http://www.cnblogs.com/xiaobaibuhei/p/3226776.html
代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int MAX=1000+10;
struct type
{
double rate;
int num;
type(double rate=0,int num=0):rate(rate),num(num){};
};
type a[MAX];
bool cmp(type a,type b)
{
return a.rate>b.rate;
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int t,f;
scanf("%d%d",&t,&f);
a[i]=type(double(f)/t,i+1);
}
stable_sort(a,a+n,cmp);
for(int i=0;i<n;i++)
{
printf("%d%c",a[i].num,i==n-1?'\n':' ');
}
if(T) putchar(10);
}
return 0;
}