[题解]UVA10026 Shoemaker's Problem

链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=967

描述:要做n双鞋子,第 i 双鞋子要做Ti天,每天消耗Si的钱(当前正在做第 i 双鞋子时不耗钱)。求在最少消耗钱的情况下做鞋子的顺序。

思路:贪心

明显是一个排序的模型,然后我们就思考顺序怎么确定。考虑当前两双鞋子a和b,它们的顺序对它们前后的鞋子都没有影响,它们所创造的影响仅仅是a和b本身的消耗。顺序是ab时,消耗为Ta*Sb;顺序是ba时,消耗为Tb*Sa。只需要比较Ta*Sb和Tb*Sa的大小排序就可以了。

我的实现:

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 #define MaxN 1020
 7 struct node
 8 {
 9     int Time,Fine,Num;
10 }Shoe[MaxN];
11 int T,n;
12 inline void Get_int(int &Ret)
13 {
14     char ch;
15     bool flag=false;
16     for(;ch=getchar(),ch<‘0‘||ch>‘9‘;)
17         if(ch==‘-‘)
18             flag=true;
19     for(Ret=ch-‘0‘;ch=getchar(),ch>=‘0‘&&ch<=‘9‘;Ret=Ret*10+ch-‘0‘);
20     flag&&(Ret=-Ret);
21 }
22 bool Cmp(node a,node b)
23 {
24     return a.Fine*b.Time > a.Time*b.Fine;
25 }
26 int main()
27 {
28     Get_int(T);
29     int i;
30     while(T--)
31     {
32         Get_int(n);
33         for(i=1;i<=n;++i)
34         {
35             Get_int(Shoe[i].Time);
36             Get_int(Shoe[i].Fine);
37             Shoe[i].Num=i;
38         }
39         sort(Shoe+1,Shoe+1+n,Cmp);
40         for(i=1;i<n;++i)
41             printf("%d ",Shoe[i].Num);
42         printf("%d\n",Shoe[n].Num);
43         if(T)
44             printf("\n");
45     }
46     return 0;
47 }

状态:

[题解]UVA10026 Shoemaker's Problem,布布扣,bubuko.com

[题解]UVA10026 Shoemaker's Problem

时间: 2024-10-23 10:26:38

[题解]UVA10026 Shoemaker's Problem的相关文章

uva10026 - Shoemaker&#39;s Problem(贪心)

题目:10026 - Shoemaker's Problem 题目大意:有个鞋匠在同一天接到了一堆的生意.可是他每天只能做一双鞋,给出做每双鞋需要的时间和推辞做鞋的赔偿.问怎样合理的分配才能使得赔偿最小. 解题思路:鞋子编号  要花的时间  需要的赔偿(每天) 1                    1                100 2                    5                  4 这样的两双鞋有两种安排: 做完1再做2      赔偿  1 * 4:

programming-challenges Shoemaker&#39;s Problem (110405) 题解

Greedy. 证明: Let's say we have job 1, 2, ..., n, and they have time and fine as t1, f1, t2, f2, ..., tn, fn and they are in the order of t1/f1 <= t2/f2 <= t3/f3 <= ... <= tn/fn So this is the objective schedule. Now we change 1 with m (1 < m

uva 10026 Shoemaker&#39;s Problem(贪心+排序)

虽然是个水题,但是在一些细节上wa了几次,好像不支持'\b'退格符号,我用在了输出空格那,结果wa了...白白 wa了几次...题意是看的题解..今天只写了两道题,速度有点慢,得加快了,以后得先认真读懂题目,题目读懂了 就相当于做出来一半然后仔细动脑想想,有想法了再敲,不能盲目的做题.另外,热烈祝贺今天c++ primer看到 了100页 思路: 这道题是让给的数据是每件工作需要做的天数和每耽误一天所需要的费用,让求一个序列使得付费最小,如果有相同答 案把字典树最小的输出...输出的是序号,该件

UVa 10026 - Shoemaker&#39;s Problem

题目:一个鞋匠接到很多任务,每个任务有一个完成需要时间,延期的任务每天会有一个罚款, 现在所有任务都延期了,问最少的罚款是多少(每天只能做一种工作). 分析:贪心.转化问题为,如果不做则罚款的数额是days*Σ(每个任务罚款): 而每做好一个就认为从这一天开始以后每天都会获得相应的罚款的收益: 求收益的最大值即可,这里按性介比排序即可. 命题:按性介比排序受益最大. 证明:价值为p[i],耗时为c[i]则: 1.如果只有两个任务则有p[i]/c[i] > p[j]/c[j]  ->  p[i]

【题解】P4137 Rmq Problem(莫队)

[题解]P4137 Rmq Problem(莫队) 其实这道题根本就不用离散化! 因为显然有\(mex\)值是\(\le 2\times 10^5\)的,所以对于大于\(2\times 10^5\)的数我们可以忽略. 然后直接莫队算就是的,开一个\(2e5\)的桶 若一个比答案小的值的桶为\(0\)了:答案更新为它 若这个\(mex\)的桶突然有值了:暴力枚举答案变大,第一个桶里没值的就是答案,更新. 有小伙伴会问,这复杂度不上天了?其实不然.移动\(ans\)的总复杂度(好像)是\(O(n\s

【题解】An Easy Problem

题目描述 给定一个正整数N,求最小的.比N大的正整数M,使得M与N的二进制表示中有相同数目的1. 举个例子,假如给定的N为78,其二进制表示为1001110,包含4个1,那么最小的比N大的并且二进制表示中只包含4个1的数是83,其二进制是1010011,因此83就是答案. 输入格式 输入若干行,每行一个数n(1≤n≤1000000),输入"0"结束. 输出格式 输出若干行对应的值. 输入样例 1 2 3 4 78 0 输出样例 2 4 5 8 83 题解 容易想到,当$n$加上$low

programming-challenges Shoemaker&amp;#39;s Problem (110405) 题解

Greedy. 证明: Let's say we have job 1, 2, ..., n, and they have time and fine as t1, f1, t2, f2, ..., tn, fn and they are in the order of t1/f1 <= t2/f2 <= t3/f3 <= ... <= tn/fn So this is the objective schedule. Now we change 1 with m (1 < m

UVA 10026 Shoemaker&amp;#39;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 jo

【小白入门向】tarjan算法+codevs1332题解报告

一.[前言]关于tarjan tarjan算法是由Robert Tarjan提出的求解有向图强连通分量的算法. 那么问题来了找蓝翔!(划掉)什么是强连通分量? 我们定义:如果两个顶点互相连通(即存在A到B和B到A的通路),则称这两个点强连通.对于一个有向图G,若是G中任意两点都强连通,则称G是一个强连通图.有向图的极大强连通子图,称为该图的强连通分量. 对于下图,{1,2,3,4}.{5}.{6}分别是它的强连通分量. 那么tarjan是如何找到这些强连通分量的呢? 说白了tarjan就是dfs