UVA 10026 Shoemaker's Problem
| Shoemaker's Problem |
Shoemaker has N jobs (orders from customers) which he must make. Shoemaker can work on only one job in each day. For each ith job, it is known the integer Ti (1<=Ti<=1000), the time in days it takes the shoemaker to finish
the job. For each day of delay before starting to work for the ith job, shoemaker must pay a fine of Si (1<=Si<=10000) cents. Your task is to help the shoemaker, writing a programm to find the sequence of jobs with minimal
total fine.
The Input
The input begins with a single positive integer on a line by itself indicating the number of the cases following, each of them as described below. This line is followed by a blank line, and there is also a blank line between two consecutive inputs.
First line of input contains an integer N (1<=N<=1000). The next N lines each contain two numbers: the time and fine of each task in order.
The Output
For each test case, the output must follow the description below. The outputs of two consecutive cases will be separated by a blank line.
You programm should print the sequence of jobs with minimal fine. Each job should be represented by its number in input. All integers should be placed on only one output line and separated by one space. If multiple solutions are possible, print the first
lexicographically.
Sample Input
1 4
3 4
1 1000
2 2
5 5
Sample Output
2 1 3 4
题意:一个鞋匠接到非常多订单。可是,每一个客户都觉得自己的订单应该被立即处理。因此,对于第i个订单。在開始处理这个订单之前,每天都要付罚金Si (1<=Si≤<=1000)。而他一天仅仅能处理一个订单。并且一个订单可能须要非常多天才干完毕。对于第i个订单。整数Ti (1<=Ti<=1000)代表处理完毕这个订单所须要的天数。
求所付罚金最少的订单处理顺序。
分析:贪心解决。对每一个订单 罚金/天数 从大到小排序。结果一样按序号排序(保证字典序最小)。
证明:假设x和y为排好的顺序中相邻的两个订单,因为x、y之后的订单顺序是固定的。所以不管是排成xy还是排成yx,对后面的罚金没有影响。罚金区别在于是排成xy还是yx。
假设是xy,则罚金为Tx*Sy;假设是yx,则罚金是Ty*Sx。
假设Tx*Sy<Ty*Sx,就排成xy;否则排成yx。
所以这样的贪心策略是正确的。
#include<cstdio>
#include<algorithm>
using namespace std; struct shoe {
int id;
int time;
int fine;
} a[1005]; bool comp(shoe x, shoe y) { //用乘法比較。避免相除以后浮点数产生误差
if(x.fine * y.time != x.time * y.fine)
return x.fine * y.time > x.time * y.fine;
return x.id < y.id;
} int main()
{
int T, n, i;
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
for(i = 0; i < n; i++) {
scanf("%d%d",&a[i].time, &a[i].fine);
a[i].id = i + 1;
}
sort(a, a+n, comp);
for(i = 0; i < n - 1; i++)
printf("%d ", a[i].id);
printf("%d\n", a[n-1].id);
if(T > 0) printf("\n");
}
return 0;
}
UVA 10026 Shoemaker's Problem的更多相关文章
- UVA 10026 Shoemaker's Problem 鞋匠的难题 贪心+排序
题意:鞋匠一口气接到了不少生意,但是做鞋需要时间,鞋匠只能一双一双地做,根据协议每笔生意如果拖延了要罚钱. 给出每笔生意需要的天数和每天的罚钱数,求出最小罚钱的排列顺序. 只要按罚款/天数去从大到小排 ...
- uva 10026 Shoemaker's Problem(排序)
题目连接:10026 Shoemaker's Problem 题目大意:有一个鞋匠接了n双要修的鞋子, 修每双鞋需要d天,每推迟一天修将亏损val元,问按什么样的顺序修鞋可以保证损失最少,如果有多种情 ...
- uva 10026 Shoemaker's Problem
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- (贪心5.2.1)UVA 10026 Shoemaker's Problem(利用数据有序化来进行贪心选择)
/* * UVA_10026.cpp * * Created on: 2013年10月10日 * Author: Administrator */ #include <iostream> ...
- uva 10026 Shoemaker's Problem _贪心
题意:鞋匠现在有n个工作要做,每个工作要x天,没延迟一天需要付款y,鞋匠每天只能做一个工作,问使得鞋匠最少赔款的工作顺序. 思路:工作和工作之间排序,如果a.value*b.day>b.valu ...
- programming-challenges Shoemaker's Problem (110405) 题解
Greedy. 证明: Let's say we have job 1, 2, ..., n, and they have time and fine as t1, f1, t2, f2, ..., ...
- UVA 10245 The Closest Pair Problem 最近点问题 分治算法
题意,给出n个点的坐标,找出两点间最近的距离,如果小于10000就输出INFINITY. 纯暴力是会超时的,所以得另辟蹊径,用分治算法. 递归思路将点按坐标排序后,分成两块处理,最近的距离不是在两块中 ...
- uva 10026 Problem C: Edit Step Ladders
http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&p ...
- UVA - 10239 The Book-shelver's Problem
Description Problem D The Book-shelver's Problem Input: standard input Output: standard output Time ...
随机推荐
- 7-10 守卫棋盘 uva11214
输入要给n*m的棋盘 均小于10 某些格子有标记 用最少的皇后 辐射到所有的标记 限时 6666ms 用IDA* 时间6000 尴尬. #include<bits/stdc++ ...
- VPS开启Google BBR
前言:系统环境为Ubuntu 18.04 修改系统变量: echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf ec ...
- 让Xcode8.0支持iOS11.2设备真机测试
最新支持11.2 (15C5097c)! 11.1 全版本! Xcode只可以支持iPhone手机对应iOS系统以下的真机测试.一般想要支持最新的iPhone手机系统,有两个方法. 第一.就需要更新X ...
- JavaScript基础 :学习javascript的原因
JavaScript是世界上最流行的脚本语言,因为你在电脑.手机.平板上浏览的所有的网页,以及无数基于HTML5的手机App,交互逻辑都是由JavaScript驱动的. 简单地说,JavaScript ...
- 冒泡排序(高级版)之C++实现
冒泡排序(高级版)之C++实现 一.源代码:BubbleSortHigh.cpp #include<iostream> using namespace std; /*定义输出一维数组的函数 ...
- HDU 4641 K-string 后缀自动机 并查集
http://acm.hdu.edu.cn/showproblem.php?pid=4641 https://blog.csdn.net/asdfgh0308/article/details/4096 ...
- String 字符串详解 / 常用API
String 详解 / 常用API 简介 String 是不可改变的字符串序列.String 为字符串常量 StringBuilder 与StringBuffer 均为可改变的字符串序列.为字符串变量 ...
- Splay-Tree理解
简介 splay tree其实就是不停的旋转,没进行一个操作都要进行旋转:例如,当访问某一个结点的时候,会通过旋转其结点使得该结点变为树根,这样保证其的平均复杂度为O(nlogn); 其的操作包括: ...
- NOIP 2002提高组 选数 dfs/暴力
1008 选数 2002年NOIP全国联赛普及组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 已知 n 个整数 x1,x2,…, ...
- ROS知识(12)----cv_bridge依赖opencv版本的问题
cv_bridge默认依赖的oencv版本是2.4.8,如果安装了新的opencv版本,比如2.4.11,那么在编译cv_bridge时候会提示无法找到opencv 2.4.8.so的库. 为解决这个 ...