3757

1 /*
2 N K F
3
4 pi bi ci
5
6 ti = Fi/pi + Fi/bi = Fi*( (pi+bi)/(pi*bi) );
7 vi = (pi*bi)/(pi+bi);
8 这是Fi文件量,机器i需要的传输时间和速度
9
10 要求F分给K台机器,最终用时t
11 对于选中的服务器,速度为vi = fi/t = (pi*bi)/(pi+bi);
12 sigma(vi) = sigma(fi)/t;
13 t = sigma(fi)/sigma(vi)
14 t = F/sigma(vi);
15
16 要求花费最小,每个被选中的服务器的花费为 fi*ci = t*vi*ci;
17 那么对于选中的K个服务器:
18 sigma(vi*t) = sigma(fi) = F, sigma(fi*ci) = sigma(vi*t*ci). t = F/sigma(vi);
19 最后有cost = sigma(fi*ci) = F*sigma(vi*ci)/sigma(vi);
20 vi已知,ci已知,F已知
21
22 转化为了分数规划问题
23 L = cost*sigma(vi)-F*sigma(vi*ci)
24 二分cost,找出L的前K大,和>0说明cost大,R=mid,和<0说明cost小,L=mid
25 或者
26 L = F*sigma(vi*ci)-cost*sigma(vi)
27 二分cost,找出L的前K小,和<0说明cost大,R=mid,和>0说明cost小,L=mid
28
29
30 */
31
32
33 // include file
34 #include <cstdio>
35 #include <cstdlib>
36 #include <cstring>
37 #include <cmath>
38 #include <cctype>
39 #include <ctime>
40
41 #include <iostream>
42 #include <sstream>
43 #include <fstream>
44 #include <iomanip>
45 #include <bitset>
46 #include <strstream>
47
48 #include <algorithm>
49 #include <string>
50 #include <vector>
51 #include <queue>
52 #include <set>
53 #include <list>
54 #include <functional>
55
56 using namespace std;
57
58 // typedef
59 typedef long long LL;
60 typedef unsigned long long ULL;
61
62 //
63 #define read freopen("in.txt","r",stdin)
64 #define write freopen("out.txt","w",stdout)
65 #define FORi(a,b,c) for(int i=(a);i<(b);i+=c)
66 #define FORj(a,b,c) for(int j=(a);j<(b);j+=c)
67
68 #define FF(i,a) for(int i=0;i<(a);i+++)
69 #define FFD(i,a) for(int i=(a)-1;i>=0;i--)
70 #define Z(a) (a<<1)
71 #define Y(a) (a>>1)
72
73 const double eps = 1e-6;
74 const double Pi = acos(-1.0);
75
76 template<class T> inline T sqr(T a){return a*a;}
77 template<class T> inline T TMAX(T x,T y)
78 {
79 if(x>y) return x;
80 return y;
81 }
82 template<class T> inline T TMIN(T x,T y)
83 {
84 if(x<y) return x;
85 return y;
86 }
87 template<class T> inline void SWAP(T &x,T &y)
88 {
89 T t = x;
90 x = y;
91 y = t;
92 }
93 template<class T> inline T MMAX(T x,T y,T z)
94 {
95 return TMAX(TMAX(x,y),z);
96 }
97
98
99 // code begin
100 int N,K;
101 double F;
102 struct node
103 {
104 double forward;
105 double v;
106 double sf;
107 friend bool operator<(node a,node b)
108 {
109 return a.sf>b.sf;
110 }
111 };
112
113 node A[20010];
114
115 int main()
116 {
117 read;
118 write;
119 double p,b,c;
120 while(scanf("%d %d %lf",&N,&K,&F)==3)
121 {
122 FORi(0,N,1)
123 {
124 scanf("%lf %lf %lf",&p,&b,&c);
125 A[i].v = (p*b)/(p+b);
126 A[i].forward = F*A[i].v*c;
127 }
128
129 double L = 0,R = 10000000000.,sum,mid;
130 while( R-L>eps )
131 {
132 mid = (L+R)/2;
133 // 算出sf
134 FORi(0,N,1)
135 {
136 A[i].sf = mid*A[i].v - A[i].forward;
137 }
138 sort(A,A+N);
139 //printf("%lf %lf\n",A[0].sf,A[1].sf);
140 // 取前k个
141 sum = 0;
142 FORi(0,K,1)
143 {
144 sum += A[i].sf;
145 }
146 //printf("%f %f\n",mid,sum);
147 if( sum>0 )
148 {
149 R = mid;
150 }
151 else
152 L = mid;
153 }
154
155 printf("%.4f\n",mid);
156 }
157 return 0;
158 }

posted @ 2011-03-02 14:30  AC2012  阅读(567)  评论(0编辑  收藏  举报