贪心算法

记录点滴。

  1 /*
  2 2015.6    HT
  3 ACM Work_3
  4 
  5 */
  6 
  7 //#include<stdio.h>
  8 #include <iostream>
  9 #include<algorithm>
 10 using namespace std;
 11 
 12 
 13 /*
 14 FatMouse' Trade
 15 老鼠有M磅猫食,可用F[i]的猫食换J[i]食物
 16 */
 17 //struct bb
 18 //{
 19 //    double get, pay;
 20 //    double ave;
 21 //}w[1000];
 22 //
 23 //bool comp(bb x, bb y)
 24 //{
 25 //    if (x.ave > y.ave) 
 26 //        return true;
 27 //    return false;
 28 //}
 29 //
 30 //int main()
 31 //{
 32 //    int n, m, i;
 33 //    double sum;
 34 //    while (scanf_s("%d %d", &m, &n))
 35 //    {
 36 //        if (m == -1 && n == -1) 
 37 //            break;
 38 //
 39 //        sum = 0;
 40 //        for (i = 0; i <= n - 1; i++)
 41 //        {
 42 //            //  J[i]  F[i]
 43 //            scanf_s("%lf %lf", &w[i].get, &w[i].pay);
 44 //            w[i].ave = w[i].get / w[i].pay;
 45 //        }
 46 //        sort(w, w + n, comp);
 47 //        for (i = 0; i <= n - 1; i++)
 48 //        {
 49 //            if (m >= w[i].pay)
 50 //            {
 51 //                sum = sum + w[i].get;
 52 //                m = m - int(w[i].pay);
 53 //            }
 54 //            else
 55 //            {
 56 //                sum = sum + w[i].ave * m;
 57 //                break;
 58 //            }
 59 //        }
 60 //        printf_s("%.3lf\n", sum);
 61 //    }
 62 //    return 0;
 63 //}
 64 
 65 
 66 
 67 /*
 68 Moving Tables
 69 将A房间桌子移到B房间,不论距离长短都需要十分钟
 70 如果每次移动的桌子不共用走廊,就可以同时移动
 71 1 3 5 7...
 72 ----------
 73 2 4 6 8...
 74 */
 75 //int main()
 76 //{
 77 //    int i, j, a[500], b[500], c[100], max, n, N, k, t;
 78 //    scanf_s("%d", &N);
 79 //    for (k = 1; k <= N; k++)
 80 //    {
 81 //        scanf_s("%d", &n);
 82 //        for (i = 0; i <= n - 1; i++)
 83 //        {
 84 //            // move from room number s to room number t 
 85 //            scanf_s("%d%d", &a[i], &b[i]);
 86 //            if (a[i] % 2 != 0)
 87 //                a[i] = a[i] + 1; // 对门单双号房间共用一片走廊
 88 //            if (b[i] % 2 != 0)
 89 //                b[i] = b[i] + 1;
 90 //            // 排序
 91 //            if (a[i] > b[i])
 92 //            {  
 93 //                t = b[i];
 94 //                b[i] = a[i];
 95 //                a[i] = t;
 96 //            }
 97 //        }
 98 //        for (i = 0; i < 100; i++)
 99 //        {
100 //            c[i] = 0;
101 //        }
102 //        for (i = 0; i <= n - 1; i++)
103 //        {
104 //            for (j = a[i] - 1; j <= b[i] - 1; j++)
105 //            {
106 //                c[j]++;
107 //            }
108 //        }
109 //        max = 0;
110 //        for (i = 0; i < 100; i++)
111 //        {
112 //            if (c[i] > max)
113 //            {
114 //                max = c[i];
115 //            }
116 //        }
117 //        printf_s("%d\n", max * 10);
118 //    }
119 //    return 0;
120 //}
121 
122 
123 
124 /*
125 Doing Homework again
126 扣分最多的先安排,安排在没有任务的那天
127 */
128 //#define MAX_num 1005  
129 //struct homework
130 //{
131 //    int day;
132 //    int score;
133 //}homework[MAX_num];
134 //
135 //bool cmp(struct homework a, struct homework b)
136 //{
137 //    return a.score > b.score ? 1 : 0;
138 //}
139 //
140 //int main()
141 //{
142 //    int T;
143 //    cin >> T;
144 //    while (T--)
145 //    {
146 //        int i, visit[MAX_num] = { 0 }, homework_num = 0, score = 0, max_score = 0;
147 //        cin >> homework_num;
148 //        for (i = 0; i < homework_num; i++)
149 //            cin >> homework[i].day;
150 //        for (i = 0; i < homework_num; i++)
151 //        {
152 //            cin >> homework[i].score;
153 //            max_score += homework[i].score;
154 //        }
155 //        sort(homework, homework + homework_num, cmp);
156 //        for (i = 0; i < homework_num; i++)
157 //        {
158 //            int d = homework[i].day;
159 //            for (; d >= 1; d--)
160 //            {
161 //                if (visit[d] == 0)
162 //                    break;
163 //            }
164 //            if (visit[d] == 0 && d > 0)    //是否可以安排这天
165 //            {
166 //                visit[d] = 1;
167 //                score += homework[i].score;
168 //            }
169 //        }
170 //        cout << (max_score - score) << endl;     //最后被扣的最少分数
171 //    }
172 //
173 //    return 0;
174 //}
175 
176 
177 
178 /*
179 今年暑假不AC
180 整数n(n<=100)表示喜欢看的节目的总数
181 n行数据,每行Ti_s, Ti_e (1<=i<=n)别表示第i个节目的开始和结束时间
182 输出能完整看到的电视节目的个数
183 */
184 //#define N 100
185 //struct node
186 //{
187 //    int s, e;
188 //}t[N];
189 //int f[31];
190 //
191 //int cmp(node i, node j)
192 //{
193 //    if (i.e == j.e)
194 //        return i.s < j.s;
195 //    return i.e < j.e;
196 //}
197 //
198 //int main()
199 //{
200 //    int n;
201 //    int i, j, k;
202 //    while (cin >> n && n)
203 //    {
204 //        for (i = 0; i < n; i++)
205 //            cin >> t[i].s >> t[i].e;
206 //        sort(t, t + n, cmp);
207 //        memset(f, 0, sizeof(f));
208 //
209 //        int mx = -1; 
210 //        k = 0;
211 //        for (i = 0; i < n; i++)
212 //        {
213 //            if (t[i].s >= mx)
214 //            {
215 //                mx = t[i].e;
216 //                k++;
217 //            }
218 //        }
219 //        cout << k << endl;
220 //    }
221 //    return 0;
222 //}
223 
224 
225 
226 /*
227 Tian Ji -- The Horse Racing
228 输的一方将要给赢的一方200两黄金
229 贪心策略:
230 一、当田忌最快的马比国王最快的马快时,用田忌最快的马赢国王最快的马。
231 二、当田忌最快的马比国王最快的马慢时,用田忌最慢的马输给国王最快的马。
232 三、当田忌最快的马跟国王最快的马一样快时,分情况。
233 1、当田忌最慢的马比国王最慢的马快,那么用田忌最慢的马赢国王最慢的马
234 2、当田忌最慢的马比国王最慢的马慢,那么用田忌最慢的马输给国王最快的马
235 3、当田忌最慢的马跟国王最慢的马相等的时候,用田忌最慢的马跟国王最快的马比
236 */
237 //int main(void)
238 //{
239 //    int num, sum;
240 //    int tianJi[10], king[10];
241 //    while (cin >> num && num)
242 //    {
243 //        if (num == 0)
244 //            break;
245 //
246 //        sum = 0;
247 //        int T = 0, TE = num - 1;
248 //        int K = 0, KE = num - 1;
249 //        for (int i = 0; i < num; i++)
250 //        {
251 //            cin >> tianJi[i];
252 //        }
253 //        for (int j = 0; j < num; j++)
254 //        {
255 //            cin >> king[j];
256 //        }
257 //        while (num--)
258 //        {
259 //            if (tianJi[T] > king[K])
260 //            {
261 //                T++;
262 //                K++;
263 //                sum = sum + 200;
264 //            }
265 //            else if (tianJi[T] < king[K])
266 //            {
267 //                TE--;
268 //                K++;
269 //                sum = sum - 200;
270 //            }
271 //            // 田忌最快的马跟国王最快的马一样快时,分情况
272 //            else
273 //            {
274 //                if (tianJi[TE] > king[KE])
275 //                {
276 //                    TE--;
277 //                    KE--;
278 //                    sum = sum + 200;
279 //                }
280 //                else if (tianJi[TE] < king[KE])
281 //                {
282 //                    TE--;
283 //                    K++;
284 //                    sum = sum - 200;
285 //                }
286 //                else
287 //                {
288 //                    if (tianJi[TE] > king[K]) 
289 //                    {
290 //                        TE--;
291 //                        K++;
292 //                        sum = sum - 200;
293 //                    }
294 //                    else 
295 //                    {
296 //                        TE--;
297 //                        K++;
298 //                    }
299 //                }
300 //            }
301 //        }
302 //        cout << sum << endl;
303 //    }
304 //    return 0;
305 //}
306 
307 
308 
309 /*
310 Wooden Sticks
311 机器处理木板,机器重置需要1分钟,如果下一块木板的长度和质量均大于等于前一块的则机器无需重置
312 否则重置,一开始机器也要花费一分钟,求处理完木板的最短时间
313 */
314 //#define N 5003
315 //struct WOOD
316 //{
317 //    int l,w;
318 //    bool ok;
319 //}wood[N];
320 //
321 //bool cmp(WOOD a, WOOD b)
322 //{
323 //    if (a.l < b.l)
324 //        return true;
325 //    else if (a.l > b.l)
326 //        return false;
327 //    else if (a.w <= b.w)
328 //        return true;
329 //    else
330 //        return false;
331 //    /*else if (a.l == b.l)
332 //    {
333 //        if (a.w <= b.w)
334 //            return true;
335 //        return false;
336 //    }
337 //    return false;*/
338 //}
339 //
340 //int main()
341 //{
342 //    int T, n, i, j, setup;
343 //    WOOD temp;
344 //    cin >> T;
345 //    while (T--)
346 //    {
347 //        cin >> n;
348 //        for (i = 0; i < n; i++)
349 //        {
350 //            cin >> wood[i].l >> wood[i].w;
351 //            wood[i].ok = 0;
352 //        }
353 //        sort(wood, wood + n, cmp);
354 //        setup = 0;
355 //        for (i = 0; i < n; i++)
356 //        {
357 //            if (!wood[i].ok)
358 //            {
359 //                setup++;
360 //                temp = wood[i];
361 //                for (j = 0; j < n; j++)
362 //                {
363 //                    if (!wood[j].ok && wood[j].l >= temp.l && wood[j].w >= temp.w)
364 //                    {
365 //                        wood[j].ok = 1;
366 //                        temp = wood[j];
367 //                    }
368 //                }
369 //            }
370 //        }
371 //        cout << setup << endl;
372 //    }
373 //    return 0;
374 //}
375 
376 
377 
378 /*
379 Fighting for HDU
380 出赛的顺序必须是从弱到强
381 每组数据占3行,第一行是一个整数n(n<100),表示每方上场队员的人数
382 后二行每行包含n个整数,分别依次表示中日两方人员的能力值,n为0的时候结束输入
383 */
384 //#define maxn    105
385 //int a[maxn];
386 //int b[maxn];
387 //
388 //int main()
389 //{
390 //    int n, i, sum1, sum2;
391 //    while (cin >> n && n)
392 //    {
393 //        for (i = 0; i < n; ++i)
394 //        {
395 //            cin >> a[i];
396 //        }
397 //        for (i = 0; i < n; ++i)
398 //        {
399 //            cin >> b[i];
400 //        }
401 //        sort(a, a + n);
402 //        sort(b, b + n);
403 //
404 //        sum1 = 0;
405 //        sum2 = 0;
406 //        for (i = 0; i < n; ++i)
407 //        {
408 //            if (a[i] > b[i])
409 //            {
410 //                sum1 += 2;
411 //            }
412 //            else if (a[i] == b[i])
413 //            {
414 //                sum1 += 1;
415 //                sum2 += 1;
416 //            }
417 //            else
418 //            {
419 //                sum2 += 2;
420 //            }
421 //        }
422 //        cout << sum1 << " vs " << sum2 << endl;
423 //    }
424 //    return 0;
425 //}
426 
427 
428 
429 /*
430 悼念512汶川大地震遇难同胞——老人是真饿了
431 市场有m种大米,各种大米的单价和重量已知
432 输入C组测试用例,第一行是两个整数n和m(0<n<=1000,0<m<=1000)分别表示经费的金额和大米的种类
433 m行数据,每行包含2个整数p和w(1<=p<=25,1<=w<=100),分别表示单价和对应大米的重量
434 最多能采购多少重量的大米呢?
435 */
436 struct nn
437 {
438     int p, w;
439 }a[1005];
440 int cmp(nn a1, nn a2)
441 {
442     if (a1.p > a2.p)
443         return a1.p < a2.p;
444     return true;
445 }
446 int main()
447 {
448     int m, i, t;
449     double sum, n;
450     cin >> t;
451     while (t--)
452     {
453         // 经费金额  大米种类
454         cin >> n >> m;
455         for (i = 0; i<m; i++)
456             // 单价  重量
457             cin >> a[i].p >> a[i].w;
458 
459         // 按单价从低到高排序
460         // 默认sort按升序排
461         sort(a, a + m, cmp);
462         sum = 0;
463         i = 0;
464         while (n > 0)
465         {
466             if (n >= a[i].p * a[i].w)
467                 sum += a[i].w;
468             else
469                 sum += n / a[i].p;
470             n -= a[i].p * a[i].w;
471             i++;
472         }
473         cout << sum << endl;
474     }
475     return 0;
476 }

 

posted @ 2015-06-08 21:45  ht-beyond  阅读(598)  评论(0编辑  收藏  举报