老师比赛时的第一题,比较简单,但多测不清空,亲人两行泪(⊙o⊙) 得了70分...
此题比较简单时间限制3.00s 暴力即可,自己看代码吧~:
#include<bits/stdc++.h>
using namespace std;
long long t,a,b,c,d,y=LONG_LONG_MAX,g=LONG_LONG_MAX,k;
long long x[205][205][205];//剪枝数组
void dfs(long long aa,long long bb,long long cc,long long dd)//暴力dfs
{if(x[aa][bb][cc]&&x[aa][bb][cc]<=dd)return;//剪枝,为什么是dd是因为深搜容易找不到最少的倒水量,所以要判断一下是否减枝if(x[aa][bb][cc]==0)x[aa][bb][cc]=dd;//没找过就直接标记else x[aa][bb][cc]=min(x[aa][bb][cc],dd);//最少的倒水量if(d>=aa&&y>d-aa||d>=aa&&y==d-aa&&dd<g)//记录最优解aa{y=abs(aa-d);k=aa;g=dd;}if(d>=bb&&y>d-bb||d>=bb&&y==d-bb&&dd<g)//记录最优解bb{y=abs(bb-d);k=bb;g=dd;}if(d>=cc&&y>d-cc||d>=cc&&y==d-cc&&dd<g)//记录最优解cc{y=abs(cc-d);k=cc;g=dd;}if(aa)//从aa倒到其他{if(bb!=b){if(b-bb>=aa){dfs(0,bb+aa,cc,dd+aa);}else{dfs(aa-(b-bb),b,cc,dd+(b-bb));}}if(cc!=c){if(c-cc>=aa){dfs(0,bb,cc+aa,dd+aa);}else{dfs(aa-(c-cc),bb,c,dd+(c-cc));}}}if(bb)//从bb倒到其他{if(aa!=a){if(a-aa>=bb){dfs(aa+bb,0,cc,dd+bb);}else{dfs(a,bb-(a-aa),cc,dd+(a-aa));}}if(cc!=c){if(c-cc>=bb){dfs(aa,0,cc+bb,dd+bb);}else{dfs(aa,bb-(c-cc),c,dd+(c-cc));}}}if(c)//从cc倒到其他{if(aa!=a){if(a-aa>=cc){dfs(aa+cc,bb,0,dd+cc);}else{dfs(a,bb,cc-(a-aa),dd+(a-aa));}}if(bb!=b){if(b-bb>=cc){dfs(aa,bb+cc,0,dd+cc);}else{dfs(aa,b,cc-(b-bb),dd+(b-bb));}}}
}
int main(){scanf("%lld",&t);while(t--){y=g=LONG_LONG_MAX;memset(x,1,sizeof(x));//这就是考试时的30分啊~k=0;scanf("%lld%lld%lld%lld",&a,&b,&c,&d);dfs(0,0,c,0);printf("%lld %lld\n",g,k);}return 0;
}
欢迎大家在评论区开喷