USACO-Chapter1-Section 1.4-Mother's Milk (milk3)
【题目描述】
农民约翰有三个容量分别是A,B,C升的桶,A,B,C分别是三个从1到20的整数, 最初,A和B桶都是空的,而C桶是装满牛奶的。有时,农民把牛奶从一个桶倒到 另一个桶中,直到被灌桶装满或原桶空了。当然每一次灌注都是完全的。由于节约, 牛奶不会有丢失。写一个程序去帮助农民找出当A桶是空的时候,C桶中牛奶所剩量的所有可能性。
【输入格式】
单独的一行包括三个整数A,B和C。
【输出格式】
只有一行,升序地列出当A桶是空的时候,C桶牛奶所剩量的所有可能性。
【输入样例一】
8 9 10
【输出样例一】
1 2 8 9 10
【输入样例二】
2 5 10
【输出样例二】
5 6 7 8 9 10
【思路】
用过程pull来实现倾倒的过程,因为牛奶重量一定,所以只需要两个参数即可,a,b,c分别代表三个桶。六种情况来模拟。以为输出要按照大小顺序,所以我们先用个二维数组来f[i,j]来表示a,c分别为i,j时候的状态,有则true。反之false。最后枚举桶排实现输出,完美解决。
【代码】
- Executing...
- Test 1: TEST OK [0.000 secs, 276 KB]
- Test 2: TEST OK [0.000 secs, 276 KB]
- Test 3: TEST OK [0.000 secs, 276 KB]
- Test 4: TEST OK [0.000 secs, 276 KB]
- Test 5: TEST OK [0.000 secs, 276 KB]
- Test 6: TEST OK [0.000 secs, 276 KB]
- Test 7: TEST OK [0.000 secs, 276 KB]
- Test 8: TEST OK [0.000 secs, 276 KB]
- Test 9: TEST OK [0.000 secs, 276 KB]
- Test 10: TEST OK [0.000 secs, 276 KB]
- All tests OK.
{
ID : c_CaM.19
LANG: PASCAL
TASK: milk3
}
Program CaM(input,output);
Var
f:array[0..20,0..20] of boolean;
aa,bb,cc,k,i,j:longint;
Function min(x,y:longint):longint;
Begin
if x<y then exit(x) else exit(y);
End;
Procedure innt;
Begin
assign(input,'milk3.in'); reset(input);
assign(output,'milk3.out'); rewrite(output);
End;
Procedure outt;
Begin
close(input);
close(output);
End;
Procedure pull(a,c:longint);
Var
b:longint;
Begin
if f[a,c] then exit;
f[a,c]:=true; b:=cc-a-c;
pull(a-min(a,bb-b),c);
pull(a-min(a,cc-c),c+min(a,cc-c));
pull(a+min(b,aa-a),c);
pull(a,c+min(b,cc-c));
pull(a+min(c,aa-a),c-min(c,aa-a));
pull(a,c-min(c,bb-b));
End;
Begin
innt;
readln(aa,bb,cc);
pull(0,cc);
for i:=0 to cc do
if f[0,i]=true then
Begin
write(i);
break;
End;
for j:=i+1 to cc do
if f[0,j]=true then write(' ',j);
writeln;
outt;
End.
浙公网安备 33010602011771号