题目大意:一个鞋匠,有n只鞋要修,修某只鞋的时间ti已知,某只鞋晚修一天要交的罚款fi也已知。现在让找个修鞋顺序使得罚款最少。
题目分析:本来想水一下这道题,没想到真的AC啦。后来又查的题解,找的解释。一个比较能说服我的解释是这样的:这个鞋匠不管怎样都要赔本,他每修一只鞋能降低的最大损失是fi/ti,只需要按fi/ti从大到小的顺序来修即可。
代码如下:
# include<iostream> # include<cstdio> # include<cstring> # include<algorithm> using namespace std; struct Job { int id,ti,si; Job(){} Job(int _id,int _ti,int _si):id(_id),ti(_ti),si(_si){} bool operator < (const Job &a) const { double f1=1.0*si/ti; double f2=1.0*a.si/a.ti; if(f1==f2) return id<a.id; return f1>f2; } }; Job JB[1005]; int main() { int T,n,a,b; scanf("%d",&T); while(T--) { scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%d%d",&a,&b); JB[i]=Job(i,a,b); } sort(JB+1,JB+n+1); for(int i=1;i<=n;++i) printf("%d%c",JB[i].id,(i==n)?' ':' '); if(T) printf(" "); } return 0; }