题意:
给一个字符串代表相邻学生的比较,L代表左边多,R表示右边多,=表示左右相等。
保证每个人拿糖>=1,在分糖最少的情况下,输出每个学生所分得的糖。
保证每个人拿糖>=1,在分糖最少的情况下,输出每个学生所分得的糖。
思路:
模拟一下,第一个人一开始拿1个,然后模拟下去,如果是=,那就=前面的,如果是R,那就比前面的多一个,如果是L,最好的情况就是拿1个,但是有可能前面那个也是1,那么就往前更新,如果符号是=,前面那个等于现在的,如果是R,那么直接跳出,不用往前更新了,因为顺序的更新本身就比之前的大了,如果是L只要判断一下前面的是不是和当前的相等,是的话,前面的就要+1,不是还是跳出就好了;
#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int>PII; const double eps=1e-5; const double pi=acos(-1.0); const int INF=0x3f3f3f3f; /* 老师分糖,给成绩好的人糖多。 给一个字符串代表学生拿糖的规律,有三种符号,L代表左边的人比自己高,R表示右边的高,=表示左右相等。 在保证分糖最少的情况下,输出每个学生所分得的糖。 */ char stu[1010]; int dp[1010]; int main() { int n,len; scanf("%d",&n); scanf("%s",stu+1); len=n; dp[0]=1; for(int i=1;i<len;i++) { if(stu[i]=='=') dp[i]=dp[i-1]; else if(stu[i]=='R') dp[i]=dp[i-1]+1; else { if(dp[i-1]>1) dp[i]=1; else { dp[i]=1; dp[i-1]++; for(int j=i-1;j>=1;j--) { if(stu[j]=='=') dp[j-1]=dp[j]; else if(stu[j]=='L') { if(dp[j-1]==dp[j]) dp[j-1]++; else break; } else break; } } } } for(int i=0;i<n;i++) { printf("%d ",dp[i]); } return 0; }