usaco 1.4.4——milk3
Mother's Milk 母亲的牛奶
描述
农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数,最初,A和B桶都是空的,而C桶是装满牛奶的。有时,约翰把牛奶从一个桶倒到另一个桶中,直到被灌桶装满或原桶空了。当然每一次灌注都是完全的。由于节约,牛奶不会有丢失。
写一个程序去帮助约翰找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。
格式
PROGRAM NAME: milk3
INPUT FORMAT:
(file milk3.in)
单独的一行包括三个整数A,B和C。
OUTPUT FORMAT:
(file milk3.out)
只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性。
SAMPLE INPUT 1
8 9 10
SAMPLE OUTPUT 1
1 2 8 9 10
SAMPLE INPUT 2
2 5 10
SAMPLE OUTPUT 2
5 6 7 8 9 10
漂亮啊。
这个时间效率。。。
Compiling... Compile: OK Executing... Test 1: TEST OK [0.000 secs, 2288 KB] Test 2: TEST OK [0.000 secs, 2288 KB] Test 3: TEST OK [0.000 secs, 2288 KB] Test 4: TEST OK [0.000 secs, 2288 KB] Test 5: TEST OK [0.000 secs, 2288 KB] Test 6: TEST OK [0.000 secs, 2288 KB] Test 7: TEST OK [0.000 secs, 2288 KB] Test 8: TEST OK [0.000 secs, 2288 KB] Test 9: TEST OK [0.000 secs, 2288 KB] Test 10: TEST OK [0.000 secs, 2288 KB] All tests OK.
Your program ('milk3') produced all correct answers! This is your submission #5 for this problem. Congratulations!
分析:
这道题的话,其实我开始还是暴力搜索啊。。。
我开始卡搜索层数,结果第三个点就崩了。。。
然后我放宽了一层,第三个点超时。。。
最终,我无可奈何地去想如何剪枝,
我注意到数不大,于是用了个三维的数组做标记,
防止重复搜索的发生,
结果搜索效率大大提升(而且为了不漏解,我把搜索层数从12层改到了50层。。。。)
如上图。。
(最最后还要提醒一点,要用writeln,。。。要不usaco算错啊亲。。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 | { ID: codeway3 PROG: milk3 LANG: PASCAL } program milk3; var i,j,n,m,k,l,a,b,c: longint ; d: array [ 0..100 ] of integer ; dd: array [ 0..100 , 0..100 , 0..100 ] of integer ; function min(x,y: longint ): longint ; begin if x<y then exit(x); exit(y); end ; procedure doing(aa,bb,cc,js: longint ); var i,j,z: longint ; begin if dd[aa,bb,cc]= 1 then exit; dd[aa,bb,cc]:= 1 ; if js> 50 then exit; inc(js); if aa= 0 then begin d[cc]:= 1 ; if cc>l then l:=cc; end ; if (aa<> 0 ) or (bb<> 0 ) then begin if bb<>b then doing(aa-min(aa,b-bb),bb+min(aa,b-bb),cc,js); if aa<>a then doing(aa+min(a-aa,bb),bb-min(a-aa,bb),cc,js); end ; if (aa<> 0 ) or (cc<> 0 ) then begin if aa<>a then doing(aa+min(a-aa,cc),bb,cc-min(a-aa,cc),js); if cc<>c then doing(aa-min(aa,c-cc),bb,cc+min(aa,c-cc),js); end ; if (bb<> 0 ) or (cc<> 0 ) then begin if bb<>b then doing(aa,bb+min(b-bb,cc),cc-min(b-bb,cc),js); if cc<>c then doing(aa,bb-min(bb,c-cc),cc+min(bb,c-cc),js); end ; end ; begin assign(input, 'milk3.in' ); reset(input); assign(output, 'milk3.out' ); rewrite(output); readln(a,b,c); doing( 0 , 0 ,c, 0 ); for i:= 0 to l- 1 do if d[i]= 1 then write (i, ' ' ); writeln (l); close(input); close(output); end . |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?