先说答案,有需要的大家看看:
#include
using namespace std;
#define endl '\n'
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t, l, r;
cin >> t;
while (t--)
{
cin >> l >> r;
int ab = r - l + 1; // 这一行数字的长度
if ((ab % 4 == 3) && r % 2 != 0) // 奇数结尾会有三个数还能组成一组
{
cout << ab / 4 + 1 << endl;
}
else
{
cout << ab / 4 << endl;
}
}
return 0;
}
有没有小伙伴这题跟我一样开局想了半天找样例的规律发现长度除以4刚好能组出答案的,想到了四个数字中取 奇偶奇 符合要求,忘了判断被落下的三个是不是也能组成一组 奇偶奇 ,结果写了一堆又臭又长的代码判断长度为3 小于3 大于3 又去判断奇偶最终很光荣地卡死在了第一题。
这题我的理解应该是:为了找出最多的组合,先找出:
在每行数字中能组成最多最大公约数为1的方法是:从头每三个连在一起的 奇偶奇 组合一定是最优解,比如说1-8:我如果按顺序硬找比如123,457倒是可行,但是数字长了的话比如1-15,我再用这种方法找123,457,6、11、13,然后就发现找不出来了,所以这个思路完全不可取。
找奇偶奇就很简单了,因为连着的三个数在没有公约数2的情况下一定是最大公约数为1的,所以这题只需要从头找他到底有多少个 奇偶奇 组合就行了,至于具体写法跟笔者不同甚至更简洁也是能实现的,只不过我更喜欢这一种我理解的方式。算法路漫漫,大家共勉!
如果本文有解决你的疑惑或对你有帮助可以点个免费的赞,谢谢各位看官!!