PC/UVA 110405/10026 Shoemaker's problem

下面的两种写法都对,其实两者是一样的,就是排序函数写的不一样。这题错了两三次,原因是刚开始错在了精度上。以后能能用乘法的尽量别用除法,例如要算a/b<c/d时即使把这样也不行a*1.0/b<c*1.0/d,特别是double在判相等是 一般用的是前者减去后者<=1e-9  鉴于上述各种问题,所以最好还是写成a*d<c*b这样会少出问题。

本题题意就是求一个加工序列是罚金最少,如果有多组时输出字典序最小的。

这里说下排序函数cmp的写法需要注意的。

int cmp(ss s,ss t)

{

return s.a<t.a;

}

int cmp(ss s,ss t)

{

return s.a<=t.a;

}

 这两者的区别是 前一个只有前者小于后者是才两者交换,后者是前者不大于后者时交换。跟要去的字典序真好想反。

View Code
 1 // 算法:假设有 n 个订单 T1 ~ Tn,罚金分别为 S1 ~ Sn,为了让罚金尽可能少,则一个订单必须被优先处
2 // 理的充要条件是:设订单 Tx(Sx) 为 T1 ~ Tn中 的任意一个订单,只要满足 Tx * (未处理订单罚金总
3 // 和) < Sx * (未处理订单需时总和),则订单 Tx 应该被优先处理。那么比较任意两个订单 Tx 和 Ty,
4 // 只要 Tx * Sy < Ty * Sx,则订单 Tx 应该优先处理,将订单按照以上规则排序,如果订单 Tx 与其
5 // 它订单都满足以上关系,则订单 Tx 必须优先被处理。
6 #include <iostream>
7 #include <cstring>
8 #include <cstdio>
9 #include <cmath>
10 #include <algorithm>
11 using namespace std;
12 struct ss{
13 int x,y,t;
14 }a[1005];
15 int cmp(ss s,ss t)
16 {
17 return s.x*t.y<t.x*s.y;
18 }
19 int main()
20 {
21 int i,n,m=0,k;
22 cin>>k;
23 while(k--)
24 {
25 m++;
26 if(m!=1)cout<<endl;
27 cin>>n;
28 for(i=1;i<=n;i++)
29 {
30 cin>>a[i].x>>a[i].y;
31 a[i].t=i;
32 }
33 sort(a+1,a+1+n,cmp);
34 cout<<a[1].t;
35 for(i=2;i<=n;i++)
36 {
37 cout<<" "<<a[i].t;
38 }
39 cout<<endl;
40 }
41 return 0;
42 }
43
44
45
46 #include <iostream>
47 #include <cstring>
48 #include <cstdio>
49 #include <cmath>
50 #include <algorithm>
51 using namespace std;
52 struct ss{
53 int x,y,t;
54
55 }a[1005];
56 int cmp(ss s,ss t)
57 {
58 if(s.x*t.y==t.x*s.y) return s.t<t.t;
59 else return s.x*t.y<t.x*s.y;
60 }
61 int main()
62 {
63 int i,j,n,m=0,k;
64 cin>>k;
65 while(k--)
66 {
67 m++;
68 if(m!=1)cout<<endl;
69 cin>>n;
70 for(i=1;i<=n;i++)
71 {
72 cin>>a[i].x>>a[i].y;
73 a[i].t=i;
74
75 }
76 sort(a+1,a+1+n,cmp);
77 cout<<a[1].t;
78 for(i=2;i<=n;i++)
79 {
80 cout<<" "<<a[i].t;
81 }
82 cout<<endl;
83 }
84 return 0;
85 }

 

posted @ 2012-03-01 11:22  我们一直在努力  阅读(255)  评论(0编辑  收藏  举报