Partial Teacher
题目大意
n
n
n 个人排成一列,有
n
−
1
n-1
n−1 个字符,
L
L
L 表示左边的人比当前这个人高,
R
R
R 表示右边的人比当前的这个人高,
=
=
= 表示当前这个人的左右两边一样高,分发糖果高的人比矮的人会多一些,问每个人最少会得到多少个糖果?
输入格式
第一行输入一个
n
n
n,表示有
n
n
n 个人。
第二行输入
n
−
1
n-1
n−1 个字符。
输出格式
输出
n
n
n 个数,代表
n
n
n 个人每个人至少得到多少个糖果。
输入样例
5
LRLR
输出样例
2 1 2 1 2
先从左往右找,更新最右边这个人得到的糖果数,然后再从当前这个人从右往左更新左边每个人至少得到的糖果数量。时间复杂度 O O O( n 2 n^2 n2)
#include <iostream>
#include <cstring>
using namespace std;
const int maxn=1e3+7;
int n,a[maxn];
char s[maxn];
int main()
{
scanf("%d",&n);
for(int i=1;i<n;++i) scanf(" %c",&s[i]);
for(int i=1;i<=n;++i) a[i]=1;
for(int i=1;i<n;i++){
if(s[i]=='L'&&a[i]<=a[i+1])
a[i]=a[i+1]+1;
if(s[i]=='R'&&a[i]>=a[i+1])
a[i+1]=a[i]+1;
if(s[i]=='=') a[i+1]=a[i];
for(int j=i-1;j;--j){
if(s[j]=='L'&&a[j]<=a[j+1])
a[j]=a[j+1]+1;
if(s[j]=='=') a[j]=a[j+1];
}
}
for(int i=1;i<=n;++i) printf("%d ",a[i]);
return 0;
}