题目大意:给出一系列的数字,第一个数字表示完成工作时所需要的时间,第二个表示时间到了,工作还没完成要罚的款,求最小罚款的工作顺序
解题思路:用(罚款/时间)为标准排序,从大到小排,按信价比最高的去做,相同的信价比的话,选择天数较前的,因为输出后要按字典序输出
#include<cstdio>
struct task {
double fine;
double time;
double day;
};
struct sord{
double n;
int day;
};
task t[1010];
sord r[1010];
int main() {
int test;
int num;
scanf("%d",&test);
while(test--) {
scanf("%d", &num);
for(int i = 0; i < num; i++) {
scanf("%lf%lf",&t[i].time,&t[i].fine);
r[i].n = t[i].fine / t[i].time;
r[i].day = i + 1;
}
sord temp;
for(int i = 0; i < num; i++)
for(int j = i + 1; j < num; j++) {
if(r[i].n < r[j].n) {
temp = r[i];
r[i] = r[j];
r[j] = temp;
}
if(r[i].n == r[j].n && r[i].day > r[j].day) {
temp = r[i];
r[i] = r[j];
r[j] = temp;
}
}
for(int i = 0; i < num - 1 ;i++)
printf("%d ",r[i].day) ;
printf("%d\n",r[num-1].day);
if(test)
printf("\n");
}
return 0;
}