Uva 10026 Shoemaker's Problem

这是一个关于UVA在线判题系统的10026题,题目要求解决一个工匠如何安排工作以使总罚金最小的问题。采用贪心策略,根据每项工作的罚款与所需时间的比例来决定工作顺序。代码中提供了C++实现,通过比较比例来排序工作并输出最佳顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接: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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值