P8437 伟大的神

Subtask 1

k = 1 k=1 k=1 的构造方式仅能为 l r l r l r l r … lrlrlrlr… lrlrlrlr 或者 r l r l r l r l … rlrlrlrl… rlrlrlrl 这种。

Subtask 2

n = m n=m n=m 的显然的解法就是输出 n 2 \displaystyle \frac{n}{2} 2n l r lr lr

综合上述算法可以得到 15 p t s 15pts 15pts 的好成绩!

Subtask 3,4

本质解法都是相同的。
k = 1 k=1 k=1 可以用 Sub1 的算法构造。
对于大部分的 k 可以如下构造,放 m 2 \displaystyle \frac{m}{2} 2m l r lr lr,然后在后面连续接上 k k k l l l 然后 1 1 1 r r r 这种循环。

but

这样的解法对于 k = 2 k=2 k=2 是有问题的,所以要做一点小调整。
观察知答案会增加 2 2 2。例子在右边,考虑 [ 2 9 ] \begin{bmatrix} 2 & 9 \end{bmatrix} [29] 的子串可知此时 m = 8 m=8 m=8:

I n p u t : Input: Input:

10 10 10 6 6 6 2 2 2

W r o n g O u t p u t : Wrong_Output: WrongOutput:

l r l r l r l l r l lrlrlrllrl lrlrlrllrl

所以可以在开头少放一个 l r lr lr 就可以保证答案不变了。
同时我们注意到所有不小于 2 2 2 k k k 都可以用 k = 2 k=2 k=2 的策略进行构造,所以连分类都省了。
然后你就被 h a c k ack ack 了!

我们事实上注意到上面的算法无法处理 n = m n=m n=m 的情况,于是我们可以选择特判。
但更简单的写法是,前面放的改成 r l rl rl,后面接的改成 l r l lrl lrl。这样就可以自然收掉 n = m n=m n=m
然后你就可以喜提 100 pts 了!

代码

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int n,m,k;
	cin>>n>>m>>k;
	if(n==m||k==1)
	{
		for(int i=0;i<n;i++)if(i%2==0)cout<<"l";else cout<<"r"; 
	}
	else
	{
		if(k==2)
		{
			for(int i=0;i<m/2-1;i++)cout<<"lr";
			for(int i=1;i<=n-m+2;i++)cout<<(i%(k+1)==0?"r":"l");
		}
		else
		{
			for(int i=0;i<m/2;i++)cout<<"lr";
			for(int i=1;i<=n-m;i++)cout<<(i%(k+1)==0?"r":"l");
		}
	}
    return 0;
}
  • 14
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值