CF67A Partial Teacher 题解

CF67A Partial Teacher 题解

CF67A

题目思路:

这道题主要思路是模拟,可以当成构造题来做。

需要注意判断在已经构造了一部分时,已经构造完毕的部分是否为最小值。

题目分析:

先设 (a) 数组来表示最终要输出的数字,则我们初始化 a[n]=1.

我们可以先把每个操作存进来,然后倒着往前进行操作。

当读到字符为 (=) 时,a[i]=a[i+1];

当读到字符为 (L) 时,a[i]=a[i+1]+1;

当读到字符为 (R) 时,此时不能单纯的减去1,要判断在这里我们已经构造完毕的数值是否为最小值。

如果是最小值,则 a[i]=a[i+1]-1 ,否则,就要进行判断,若右边值是1就加1,以此类推。

代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#define ll long long
using namespace std;
int a[1002],i,j,n;
char ch[1001];

void work(char cha) {
	if(cha=='=')
		a[i]=a[i+1];
	else if(cha=='L')
		a[i]=a[i+1]+1;
	else if(cha=='R') {
		a[i]=1;
		if (a[i+1]==1) {
			a[i+1]++;
			for (int j=i+1; j<=n; j++) {
				if (ch[j]=='=') {
					a[j+1]=a[j];
				} else if (ch[j]=='R'&& a[j+1]==a[j]) {
					a[j+1]++;
				} else {
					break;
				}
			}
		}
	}
}

int main() {
	cin>>n;
	for(i=1; i<n; ++i)
		cin>>ch[i];
	a[n]=1;
	now=n;
	for(i=n-1; i>=1; --i)
		work(ch[i]);
	for(i=1; i<=n; ++i)
		cout<<a[i]<<" ";
	return 0;
}
原文地址:https://www.cnblogs.com/EdisonBa/p/13810083.html