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.

posted on   codeway3  阅读(327)  评论(0编辑  收藏  举报

编辑推荐:
· 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,谁才是开发者新宠?

导航

< 2011年10月 >
25 26 27 28 29 30 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 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示