这一题大概就是讲我们现在有个a体积容器(精确),有个b体积容器(精确),俩容器上都没有刻度。我们有无限的水也可以肆无忌惮地浪费水,通过左倒右倒,左加右加,精确凑出目标值tar体积的水(好敷衍的题目概要,但it doesn't matter)
我们先假设a<b
我们要先清楚定义域,tar<=a,a<tar<=b,b<tar<=a+b,a+b<tar 四种情况,最后一种情况不通过
我们观察前三种情况发现,tar这个结果可以由一个不满容器,或者一个不满容器+一个满容器或者一个满容器或者两个满容器凑成(不可能出现两个不满容器)
满容器有手就行,那我们只用解决不满容器能出现什么体积就可以解决问题了(把大问题转化为小问题)
上个图表明一下我的思考过程
第一种情况,假设已有一个不满容器a,把b倒满水,倒入a中,b形成一个新的不满容器
第二种情况,假设已有一个不满容器b,把a倒满水,倒入b中,b没有溢出形成新不满容器
第三种情况,假设已有一个不满容器b,把a倒满水,倒入b中,b溢出a形成新不满容器
第四种情况,假设已有一个不满容器b,a中不放水,倒入a中,b形成一个新的不满容器
最后,通过严谨的定义域进行判定,得出到底行还是不行。
上代码:
#include<stdio.h>
int a,b,tar;
bool axis[1000009];
void work(int x){
if(axis[x]) return ;
if(x>b) return ;
axis[x]=1;
if(x<=a)work(b-(a-x));
if(x<=b){
if(x+a<=b) work(x+a);
else work(a-(b-x));
}
if(x<=b&&x>a) work(x-a);
}
bool core(){
if(tar>a+b) return 0;
if(a>b){
int c=a;
a=b;
b=c;
}
work(0);
work(a);
work(b);
if(tar<=b&&axis[tar]) return 1;
if(tar>a&&axis[tar-a]&&tar-a<=b) return 1;
if(tar>b&&axis[tar-b]&&tar-b<=a) return 1;
return 0;
}
int main(){
scanf("%d%d%d",&a,&b,&tar);
if(core())printf("1111");
else printf("2222");
return 0;
}
还有ac截图