打卡信奥刷题(1699)用C++实现信奥 P8248 简单数列

P8248 简单数列

题目描述

给你一个数 nnn,你需要求出一个长度为 nnn 的数组 aaa,(下标从 111 开始,且元素都为 1,2,31,2,31,2,3444),使得:

  • 对于第 iii 个数,对于所有的 1≤len≤⌊i2⌋1 \le len \le \lfloor\frac{i}{2}\rfloor1len2i, ai−len+1…ia_{i-len+1\dots i}ailen+1iai−len×2+1…i−lena_{i-len\times2+1\dots i-len}ailen×2+1ilen 不相同。(⌊x⌋\lfloor x \rfloorx 表示对 xxx 下取整)

  • 说人话,就是没有任何连续的连续子串相同。

输入格式

一行一个正整数 nnn

输出格式

一行,nnn 个正整数,数组 aaa

输入输出样例 #1

输入 #1

3

输出 #1

1 2 3

输入输出样例 #2

输入 #2

6

输出 #2

1 2 3 4 1 3

说明/提示

对于 20%20\%20% 的数据,满足 1≤n≤101 \le n \le 101n10

对于 40%40\%40% 的数据,满足 1≤n≤301 \le n \le 301n30

对于 100%100\%100% 的数据,满足 1≤n≤5001 \le n \le 5001n500

C++实现

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
ll n,ans[509],flag=0,k;
bool check(ll x){
	for(ll i=1;i*2<=x;i++)	{
		k=0;
		for(ll j=1;j<=i;j++)		{
			if(ans[x-j+1]!=ans[x-i-j+1])
				k=1;
		}
		if(k==0)
			return false;
	 } 
	return true;
} 
void dfs(ll x){
	if(flag==1)
		return ;
	if(x==501)	{
		for(ll i=1;i<=n;i++)		{
			cout<<ans[i]<<' ';
		}
		flag=1;
		return ;
	}
	for(ll i=1;i<=4;i++)	{
		if(flag==1)
			return ;
		ans[x]=i;
		if(check(x)==true)		{
			dfs(x+1);
		}
		ans[x]=0;
	}
}
int main(){
	cin>>n;
	dfs(1);
	return 0;
}

在这里插入图片描述

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值