已经做了一些题了,但是没有来得及记录,在近期做过的一些题目中,有一些是值得被记录的,它们的思路比较精妙或不容易很快想到(至少对于我来说),对于这样的题目我会试着整理它们并在某一时间进行对该栏目的更新。
本次带来的题目,并不是非常难的题(最近更新的题目应该都是如此),不过我仍认为不使用算法而使用思维和数学推导的题目,反而对于现在的我有些许难度,所以我要记录下它们,也为后来的读者尽量做下详细的题解
题目大意为:黑板上写下1、2、3数字各多少个,然后每次的操作是使用黑板擦擦去其中的两个数字各一个,然后再添加上第三个数字,问的是:是否有办法使得最后黑板上仅剩下1或2或3其中的一个,并按顺序输出三个数字,以代表该数字是否能被一系列操作后仅剩下。
题目思路:一开始通过观察我认为这道题就不像是用某种算法解决的问题,然后我考虑暴力,发现无从下手,因为无法很好的枚举下来,每次该如何操作擦去这一行为,如果给出的数据是某两个数字数目相等的话也不用我们去暴力枚举了,但是如果数目不一致又不知从何下手,然后我开始观察规律,发现两个规律,如果三数字数目相等则一定能剩下其中一个,所以这种一般都是三个1的输出,某数字若较大,通常也能通过其他两个较小数的抵消,使这个较大数字更大,然后最后就只剩它一个了,于是我就写下了错误的代码……
正解:如果两个数本身个数相等,那么肯定会经过若干次的重复兑换成另一个数字的操作,完全消没这两个数字,此时就会剩下另一个数字,那如果两个数字不等呢?我们可以考虑让这两个数字生成另一个数字首先,然后比较参与兑换的那两个数此时这两个数谁剩的多,拿剩的多的数字和新生成的另一个数字作用,这样可以达到一个目的:使两个数字数目都保持不变,而另一个数字数目减2,可证明当这两个数字和为偶数时,一定能通过若干次上述操作完成仅剩一个数字的结果!
举例说明:假设我们要最后只剩下1这个数字,那么我们用2和3才能兑换出1,并且该次操作会使2和3数目各减少1个,然后我们考虑用新生成的这多出来一个的1和另外的两个数字也即是2和3中剩余的个数最多的一个结合,就能生成出另一个,比如此时2剩的比较多,那么拿这个1和2作用,生出来3,并消耗一个2和一个1,这样操作导致1没有减少,3也没有减少,因为这回操作中1和3都各自生成1次使用1次,而2生成0次,使用2次,所以会让2总数减少两次,我们又可以很轻松验证如果两个数字都为奇/偶数时且他们数目不等,那么一个数不停减少2,一定能够使这两个数字最后相等,且两个奇数和为偶数,两个偶数也和为偶数,所以验证了上面的观点,所以正解应为判断两个数字和是否偶数,如果是则通过它们两个生成出来的另一个数字的位置输出1表示可以最后只剩下它自己。
#include <iostream>
using namespace std;
int main()
{
int t; cin >> t;
while (t -- )
{
int n1, n2, n3;
cin >> n1 >> n2 >> n3;
if ((n2 + n3) % 2 == 0) cout << 1 << ' ';
else cout << 0 << ' ';
if ((n1 + n3) % 2 == 0) cout << 1 << ' ';
else cout << 0 << ' ';
if ((n1 + n2) % 2 == 0) cout << 1 << ' ';
else cout << 0 << ' ';
cout << endl;
}
return 0;
}
代码看上去还是很好写的,但是思路有一丢丢难想,看来很多佬们的题解 ,都是一笔带过,没有说清楚为什么是这么做的,还有的写的很复杂。
如果帮助到你了,请别忘了一键三连哦,多多支持,期待下次产生更有价值的作品,回访和壶关也是可以滴!!