问题 M: 克隆玩具
时间限制: 1 Sec 内存限制: 128 MB
提交: 257 解决: 45
[提交][状态][讨论版][命题人:acm4302]
题目描述
你只有一个A类型玩具,现在有个有两种功能的机器:
1. 加工一个A类型的玩具能够再得到一个A类型的玩具和一个B类型的玩具。
2. 加工一个B类型的玩具,能得到两个B类型的玩具。
问经过多次加工之后,能否恰好得到n个B类型的玩具和m个A类型的玩具(不能扔掉任何玩具哦)。
输入
两个整数n,m(0<=n,m<=1e9)加工之后B类型玩具的数量和A类型玩具的数量。
输出
能恰好得到n个B类型的玩具和m个A类型的玩具的话输出:Yes
不能的话输出:No
样例输入
6 3
样例输出
Yes
提示
样例中,用两次功能1,得到三个A类玩具和两个B类玩具;再使用两次功能2,再得到4个B类玩具,这样就一共得到了6个玩具B和3个玩具A。
分析:本来现在都不怎么喜欢写题解了,但是这道题实在是坑了我不少时间,必须要总结一下经验。
首先题目的理解就有些问题,A可以加工成A+B,但是这个模板A也是在的。
B可以加工成两个B,模板同样是在的,扣题目字眼的我一直没理解对意思.....以为B加工后之前的就消失不见了....
那么就好分析多了,可以用n-m+1算出需要通过操作2得到B的数量,因为m是包含了初始的一个A的,所以后面+1.
操作二得到的B的个数必须是偶数,这是显而易见的。判断即可。
需要注意的特例:
1.如果m为0,那么n不管为多少都为NO
2.A的数量最多比B多一个,因为只有操作一可以产生A,但同时也产生了B
AC代码:
/*特殊情况一定要仔细考虑!*/
#include<iostream>
using namespace std;
int main()
{
int flag=0;
int n,m;
cin>>n>>m;
if(n>0&&m==0)
{
cout<<"No";
return 0;
}
else if(m-n>1)
flag=0;
else if((n-m+1)%2==0)
{
flag=1;
}
if(flag)
cout<<"Yes";
else
cout<<"No";
return 0;
}