USACO的题
Farmer John有两个挤奶棚,每个挤奶棚里各有一个奶罐和一个装有10个各种尺寸的桶的储物柜。他喜欢将在两个挤奶棚之间来回运送牛奶作为一种锻炼方式。
周一,Farmer John量了恰好1000加仑的牛奶放在第一个挤奶棚的奶罐里,又量了恰好1000加仑的牛奶放在第二个挤奶棚的奶罐里
周二,他从第一个挤奶棚里取出一个桶,并装满牛奶,然后将牛奶运到第二个挤奶棚,并将牛奶倒进奶罐。他把这个桶留在了第二个挤奶棚。
周三,他从第二个挤奶棚里取出一个桶(可能是周二留在这里的),并装满牛奶,然后将牛奶运到第一个挤奶棚,并将牛奶倒进奶罐。他把这个桶留在了第一个挤奶棚。
周四,他从第一个挤奶棚里取出一个桶(可能是周三留在这里的),并装满牛奶,然后将牛奶运到第二个挤奶棚,并将牛奶倒进奶罐。他把这个桶留在了第二个挤奶棚。
周五,他从第二个挤奶棚里取出一个桶(可能是周二或周四留在这里的),并装满牛奶,然后将牛奶运到第一个挤奶棚,并将牛奶倒进奶罐。他把这个桶留在了第一个挤奶棚。
此时Farmer John测量了第一个挤奶棚的奶罐里的牛奶。他总共可能得到多少种不同的读数?
输入格式(文件名: backforth.in):
输入的第一行包含10个整数,为第一个挤奶棚里初始的桶的容积。输入的第二行也包含10个整数,为第二个挤奶棚里初始的桶的容积。所有桶的容积均在1...100的范围内。
输出格式(文件名: backforth.out):
输出Farmer John在周五之后测量第一个挤奶棚里的奶罐的牛奶时可能得到的读数的数量
输入样例:
1 1 1 1 1 1 1 1 1 2
5 5 5 5 5 5 5 5 5 5
输出样例:
5
在这个例子中,最后第一个挤奶棚的奶罐中的牛奶量总共有5种可能的结果
1000:FJ可以在每次往返的时候都携带同一个桶,从而不会改变第一个挤奶棚的奶罐的牛奶量。
1003:FJ可以在周二运送2个单位,周三5个单位,周四1个单位,周五1个单位。
1004:FJ可以在周二运送1个单位,周三5个单位,周四1个单位,周五1个单位。
1007:FJ可以在周二运送1个单位,周三5个单位,周四2个单位,周五5个单位.
1008:FJ可以在周二运送1个单位,周三5个单位,周四1个单位,周五5个单位。
我的离谱代码:
#include<bits/stdc++.h>
using namespace std;
int ans[1205];
void yun(int a[],int b[],int day,int n){
if (day==2 || day==4){
for (int i=1;i<=10;i++){
b[11]=a[i];
swap(a[i],a[10]);
yun(a,b,day+1,n-b[11]);
}
}
if (day==3 || day==5){
for (int i=1;i<=11;i++){
a[10]=b[i];
swap(b[i],b[11]);
yun(a,b,day+1,n+a[10]);
}
}
if (day==6) ans[n]++;
}
int main(){
int a[15],b[15],sum=0;
//freopen("backforth.in","r",stdin);
//freopen("backforth.out","w",stdout);
for (int i=1;i<=10;i++) cin>>a[i];
for (int i=1;i<=10;i++) cin>>b[i];
yun(a,b,2,1000);
for (int i=800;i<=1200;i++){
if (ans[i]){
sum++;
cout<<i<<endl;
}
}
cout<<sum;
//fclose(stdin);
//fclose(stdout);
return 0;
}
格式可能有些乱,我从dev复制出来就是这样
悬关!!!