洛谷 P7817 [RC-05] 迷失自我 题解

22 篇文章 0 订阅
21 篇文章 0 订阅

这道题在比赛中是第一题,所以理论上讲并不算很难,但看到题面,心中不免有些颤动。再看测试数据,一个测试点 2 2 2 分,另一个有 98 98 98 分,目测应该是一个规律题,但写了半天就是写不出来,直到赛后看了公开的题解才恍然大悟,所以我在这里更通俗的说一下解法,也是弥补一下当时的遗憾~~

题目传送门

思路

  • 对于第一个测试点,考虑了一下,直接暴力搜索,可以很轻松地拿到 2 2 2 分。

  • 对于第二个测试点,很显然第一种策略肯定是不行的,所以要换一种思维方式,因为字符串 S S S T T T 都只是由 7 7 7 9 9 9 组成的,所以对于任意一个长度大于 2 2 2 的字符串,串中一定存在一个数的出现次数大于 1 1 1,所以不难发现,两个重复出现的数的最大公约数一定等于这个这个数,这两个重复出现的数字也可以看做长度为 1 1 1 的区间。因此,可以把串中所有满足最大公约数为 7 7 7 9 9 9 并且长度为 1 1 1 的区间对拿出来组成两个集合,这两个集合就可以唯一确定这个串(不明白的可以自己举个例子写一下)。

所以对于一个长度小于 2 2 2 的字符串,它不满足第二种方法,推一下的话都只有一对字符串无法识别。所以直接判断 n n n 的范围直接输出对应答案即可。

Code

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
inline long long read()
{
	long long s=0,w=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') w=-1;
		ch=getchar();
	} 
	while(ch>='0'&&ch<='9'){
		s=s*10+ch-'0';
		ch=getchar();
	}
	return s*w;
}
long long n,t;
void work()
{
	n=read();
	if(n>2)
		cout<<0<<endl;
	if(n<=2)	
		cout<<1<<endl; //推出的结果
}
int main()
{
	t=read();
	while(t--)
		work();
	return 0;
}

对于这道题,收获还是蛮多的~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值