CF1554D Diane 题解

很显然,这是一道智商题(bushi)

题目链接放着了哦
我的博客食用更佳
晚上实在没空打 CF,第二天早上补题目,看到 D 题的样例输出瞬间懵了,但是感觉不是这样的。
后来想了半天看了 tags,上面写着 greedy (贪心)。我才想到,只用 a b c abc abc 三个字母,搞贪心的话也可以实现。


题目(已翻译)

给你一个整数 n n n。找出任何长度为 n n n字符串 s s s,只包含英文小写字母,使 s s s 的每个非空子字符串 s s s奇数次数出现。

如果字符串 a a a 是字符串 b b b 的子字符串,那么 a a a 可以从 b b b 中获得,方法是从开头删除几个(可能是零个或全部)字符,从结尾删除几个(可能是零个或全部)字符。

输入

第一行包含一个整数 t t t
接下来 t t t 行,每行是一个整数 n n n

输出

对于每个测试用例,打印一行包含字符串 s s s 的代码。
如果有多个这样的字符串,输出任何一个。以此可以证明这样的字符串在给定的约束条件下始终存在。

样例输入

4
3
5
9
19

样例输出

abc
diane
bbcaabbba
youarethecutestuwuu

数据约定

1 ⩽ t ⩽ 500 1\leqslant t\leqslant 500 1t500 1 ⩽ n ⩽ 1 0 5 1\leqslant n\leqslant 10^5 1n105
保证总和 n n n 在所有测试用例中不超过 3 ⋅ 1 0 5 3 \cdot 10^5 3105


总之,这道题的基本想法就是,左边放 1 2 ⋅ n \displaystyle\frac{1}{2}\cdot n 21n (向下取整)个 a a a
如果是偶数个,那中间放个 b b b奇数个就放 b c bc bc
然后再放 1 2 ⋅ ( n − 1 ) \displaystyle\frac{1}{2}\cdot (n-1) 21(n1) (向下取整)个 a a a 拿去补剩下的字符。
这样就可以保证 a a a b b b c c c 都是奇数个,且有关 a a a 的子字符串也是奇数个。

代码实现

#include<bits/stdc++.h>//万能头文件
using namespace std;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);//加速
	int t;
	cin>>t;
	while(t--){
		int n;
		cin>>n;
		if(n%2){//如果是奇数
			if(n==1) cout<<"a\n";//这里防止出现 bc 而变成三位字符
			else{
				string s=string(n/2,'a')+"bc"+string(n/2-1,'a');
				cout<<s<<"\n";
			}
		}
		else{
			string s=string(n/2,'a')+"b"+string(n/2-1,'a');
			cout<<s<<"\n";
		}
	}
	return 0;
}//完结撒花

好家伙我写完之后看了其他人的代码参考做题解的时候,发现日本选手 SSRS_ 的代码与我不谋而合
不能说很像吧只能说是一模一样

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值