HDU-3573 Buy Sticks

本文探讨了一种解决木匠师傅如何高效截断木棍问题的方法,通过数学思维实现最大利用率,减少浪费并提高工作效率。文章提供了一个实际应用场景下的解决方案,并通过代码示例展示了解决过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

  一开始用模拟,结果超时了,后面想想思路也是错的。这题应该是这样去考虑,现在想象我们是一个木匠师傅,现在要为客户来解决这个问题,当我拿到一根长为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 }

  

  

转载于:https://www.cnblogs.com/Lyush/archive/2011/08/27/2155593.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值