题解:CF379B New Year Present
其实本题难度(个人)不超过橙题。
思路:
由于题目要求方案长度不要求最短,只要长度不超过
- 如果目前不在最后一个:输出
a_i-1 次PRL
(凑步数,因为不能连续两次塞钱),然后输出PR
(不用回来了,如果a_i \ne 0 则放)。 - 在最后一个:输出
a_i-1 次PLR
(不能越界),然后输出P
。代码:
#define MAIN signed main() #define SPEEDUP ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) #define USING using namespace std #define END return 0 #define LL long long #define ULL unsigned long long #define LD long double #define STR string #define EL '\n' #define BK break #define CTN continue #define INF INT_MAX #define UINF INT_MIN #define IN(n) cin >> n #define OUT(n) cout << n #define OUTL(n) cout << n << EL #define FP(i,a,b) for(i = a;i < b;i++) #define FM(i,a,b) for(i = a;i > b;i--) #define FL(i,a,b) for(i = a;i <= b;i++) #define FG(i,a,b) for(i = a;i >= b;i--) //以上为缺省源 #include <bits/stdc++.h> USING; int n,a[300],i,j; MAIN { SPEEDUP; IN(n); FP(i,0,n) IN(a[i]); FP(i,0,n-1) { if(a[i])//如果这个钱包需要放钱 { FP(j,0,a[i]-1)//不断放钱 OUT("PRL"); OUT("PR");//放完后直接右移,不回来 } else//直接右移跳过 OUT('R'); } if(a[n-1])//同样判断最后一个钱包 { FP(j,0,a[n-1]-1)//不断放钱 OUT("PLR"); OUT('P');//放最后一个钱 } END; }