Codeforces Round 969 (Div. 2):A - Dora‘s Set题解C++,给自己陷入死胡同了,果然真理总是简洁朴素优美

先说答案,有需要的大家看看:

#include <iostream>
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的,所以这题只需要从头找他到底有多少个 奇偶奇 组合就行了,至于具体写法跟笔者不同甚至更简洁也是能实现的,只不过我更喜欢这一种我理解的方式。算法路漫漫,大家共勉!💪

如果本文有解决你的疑惑或对你有帮助可以点个免费的赞,谢谢各位看官!!👍

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醒了不起的盖茨比Z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值