P8248 简单数列
题目描述
给你一个数 nnn,你需要求出一个长度为 nnn 的数组 aaa,(下标从 111 开始,且元素都为 1,2,31,2,31,2,3 或 444),使得:
-
对于第 iii 个数,对于所有的 1≤len≤⌊i2⌋1 \le len \le \lfloor\frac{i}{2}\rfloor1≤len≤⌊2i⌋, ai−len+1…ia_{i-len+1\dots i}ai−len+1…i 与 ai−len×2+1…i−lena_{i-len\times2+1\dots i-len}ai−len×2+1…i−len 不相同。(⌊x⌋\lfloor x \rfloor⌊x⌋ 表示对 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 101≤n≤10;
对于 40%40\%40% 的数据,满足 1≤n≤301 \le n \le 301≤n≤30;
对于 100%100\%100% 的数据,满足 1≤n≤5001 \le n \le 5001≤n≤500。
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考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
用C++实现信奥 P8248 简单数列&spm=1001.2101.3001.5002&articleId=149459557&d=1&t=3&u=026336f676ef4b2394ff5d0d87f4c416)
1419

被折叠的 条评论
为什么被折叠?



