专栏文章
题解:CF2056C Palindromic Subsequences
CF2056C题解参与者 3已保存评论 2
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @miqh0eip
- 此快照首次捕获于
- 2025/12/04 04:39 3 个月前
- 此快照最后确认于
- 2025/12/04 04:39 3 个月前
人类智慧。
思路
发现第三组样例中 ,我们只需要在这一组的答案之后输出一些没出现过的数就可以通过 的点。这是非常显然的,如果一个数字只出现过一次那么它不会构成更长的回文序列。
同理第二组样例中 ,用它通过 的点。
发现在第一组样例之后接上一个 后 。用它通过 的点。 输出样例。
同理第二组样例中 ,用它通过 的点。
发现在第一组样例之后接上一个 后 。用它通过 的点。 输出样例。
代码
好想但是没正解好写。
CPP#include<bits/stdc++.h>
using namespace std;
int T,n;
int main(){
scanf("%d",&T);
while(T --){
scanf("%d",&n);
if(n == 6) printf("1 1 2 3 1 2");
else if(n == 7) printf("1 1 2 3 1 2 3");
else if(n == 8) printf("1 1 2 3 1 2 3 4");
else if(n >= 9 && n <= 14){
printf("7 3 3 7 5 3 7 7 3 ");
for(int i = 10;i <= n;i ++) printf("%d ",i); //注意不要和前面的数字重复,需要保证刚好 n 个数字
}
else{
printf("15 8 8 8 15 5 8 1 15 5 8 15 15 15 8 ");
for(int i = 16;i <= n;i ++) printf("%d ",i);
}
printf("\n");
}
}
正解思路
参考完善 jzjr的题解。
考虑 的值。
肯定不行,长度为 的子序列只有 个。
不行,这样的序列势必由两个相同的数字构成,每个数字出现 次,只有 个。
:要求的子序列由两端相同的数字和中间一个数字构成。构造:可以在左端放两个 ,右端放一个 ,中间的每一个数字任意放,互不相同即可。
左端靠右的 作为中间数做出了 的贡献,中间每一个数作为中间做出 的贡献,易知 。在 时恒成立。
肯定不行,长度为 的子序列只有 个。
不行,这样的序列势必由两个相同的数字构成,每个数字出现 次,只有 个。
:要求的子序列由两端相同的数字和中间一个数字构成。构造:可以在左端放两个 ,右端放一个 ,中间的每一个数字任意放,互不相同即可。
左端靠右的 作为中间数做出了 的贡献,中间每一个数作为中间做出 的贡献,易知 。在 时恒成立。
正解代码
CPP#include<bits/stdc++.h>
using namespace std;
int T,n;
int main(){
scanf("%d",&T);
while(T --){
scanf("%d",&n);
printf("1 1 ");
for(int i = 4;i <= n;i ++) printf("%d ",i);
printf("1\n");
}
return 0;
}
相关推荐
评论
共 2 条评论,欢迎与作者交流。
正在加载评论...