HDU-3573 Buy Sticks

  一个很朴素的问题,但是貌似以前没有接触到过,给定一个长度的棍子,现在要得到三种规格的棍子,每种若干条,问最少需要多少条长棍来分成三种棍子。

  一开始用模拟,结果超时了,后面想想思路也是错的。这题应该是这样去考虑,现在想象我们是一个木匠师傅,现在要为客户来解决这个问题,当我拿到一根长为75的木棍时,我肯定要物尽其极,最大利用率的截断方式是 75 = 20 + 20 + 32 次之 为 75 = 20 + 20 + 28 , 再者为 75 = 20 + 20 + 20, 这时截成三段,当然还可以截成两段,这时组合方式就没有关系了,因为前面已经算完了所有组成三段的可能,也就不许要考虑剩余的多少问题,两段两段截吧,如果最后留下一根木棍的任务,就要单独拿一根长棍了,所以干脆加上1除以2。

  代码如下:

 1 #include <cstring>
2 #include <cstdlib>
3 #include <cstdio>
4 #include <cmath>
5 using namespace std;
6
7 inline int Min( int x, int y )
8 {
9 return x < y ? x : y;
10 }
11
12 int main()
13 {
14 int T;
15 scanf( "%d", &T );
16 for( int ti = 1; ti <= T; ++ti )
17 {
18 int ans = 0, a, b, c, t;
19 scanf( "%d %d %d", &a, &b, &c );
20 ans += ( t = Min( a / 2, c ) );
21 a -= 2 * t, c -= t;
22 ans += ( t = Min( a / 2, b ) );
23 a -= 2 * t, b -= t;
24 ans += ( t = a / 3 );
25 a -= 3 * t;
26 ans += ( a + b + c + 1 ) / 2;
27 printf( "Case %d: %d\n", ti, ans );
28 }
29 return 0;
30 }

  

  

posted @ 2011-08-27 16:21  沐阳  阅读(276)  评论(0编辑  收藏  举报