codeforces 466A. Cheap Travel 解题报告

题目链接:http://codeforces.com/problemset/problem/466/A

题目意思:一个 ride 需要 a 卢布,m 个 ride 需要 b 卢布,这两种方案都可以无限制地采用,要完成 n rides 最少需要多少卢布。

    只要理清思路,一步一步做就不难了。

    首先 要知道 n 和 m 的大小关系是不确定的,有可能出现 n < m 情况。此时面临的选择是:一张 b 卢布 还是 n * a 卢布。

    如果 n >= m 要分情况讨论。

    由于我们希望用的卢布越少越好,那么首先算出如果用 b 卢布,就需要比较 a 和 b/m(每个ride需要多少卢布) 的大小关系,如果后者比较少,那么就希望用尽可能多的 b 卢布。最后如果有余数r,就看对于这个余数是采用 r*a 还是 b;如果 a < b/m,那么 n 个 rides 都用 a 卢布来达成。

   

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstdlib>
 4 #include <cstring>
 5 using namespace std;
 6 
 7 int main()
 8 {
 9     int n, m, k;
10     double a, b;
11     while (scanf("%d%d%lf%lf", &n, &m, &a, &b) != EOF)
12     {
13         int ans;
14         if (n < m)
15             ans = (a*n > b ? b : a*n);
16         else if (a >= b/m)
17         {
18             ans = n/m * b;
19             int r = n - n/m * m;
20             if (r)
21                 ans += min(r*a, b);
22         }
23         else
24             ans = n * a;
25         printf("%d\n", ans);
26     }
27     return 0;
28 }

 

    

posted @ 2014-09-13 10:14  windysai  阅读(518)  评论(0编辑  收藏  举报