CF67A Partial Teacher 题解
题目思路:
这道题主要思路是模拟,可以当成构造题来做。
需要注意判断在已经构造了一部分时,已经构造完毕的部分是否为最小值。
题目分析:
先设 (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;
}