题目链接:http://codeforces.com/contest/733/problem/C
思路:模拟
因为数组b里的元素是顺序对应a数组元素的和,可以开个c数组储存b数组元素对应的a数组元素区间;
然后对每个c数组区间,找出最大并且存在与其相邻且小于它的元素的元素,从这个元素开始向左或者向右合并此区间所有元素;
要注意一下区间长度为1即只有一个元素的情况,还有输出的位置是合并后的相对位置;
代码:
1 #include <bits/stdc++.h>
2 #define MAXN 501
3 using namespace std;
4
5 int main(void){
6 int n, a[MAXN], k, b[MAXN], c[MAXN];
7 scanf("%d", &n);
8 for(int i=0; i<n; i++){
9 scanf("%d", &a[i]);
10 }
11 scanf("%d", &k);
12 for(int i=0; i<k; i++){
13 scanf("%d", &b[i]);
14 }
15 int ans=0, i=0, flag=0, jj=0, gg=1;
16 c[0]=0;
17 while(jj<k&&i<n){
18 ans+=a[i];
19 if(ans==b[jj]){
20 ans=0;
21 jj++;
22 c[gg++]=i;
23 }
24 i++;
25 }
26 if(jj==k&&i==n){
27 string d;
28 int e[MAXN], star=0;
29 for(i=0; i<k; i++){
30 int flag=1, mm=0, num=0, j;
31 for(int j=c[i]+1-(i==0); j<=c[i+1]; j++){
32 if(a[j]>num){
33 num=a[j];
34 mm=j;
35 }
36 }
37 int mmm=mm;
38 if(mmm==c[i]+1-(i==0)&&mmm<c[i+1]&&a[mmm]==a[mmm+1]){
39 while(mmm<c[i+1]&&a[mmm]==a[mmm+1]){
40 mmm++;
41 }
42 // cout << mmm << "**" << c[i+1] << endl;
43 if(mmm!=c[i+1]){
44 mm=mmm;
45 }else{
46 flag=0;
47 }
48 // cout << flag << endl;
49 }
50 int jj=mm-c[i]+1+i-(i!=0);
51 // cout << mm << " " << jj << endl;
52 if(mm<c[i+1]&&a[mm]>a[mm+1]){
53 int x=mm;
54 while(x<c[i+1]){
55 d[star]='R';
56 e[star]=jj;
57 x++;
58 star++;
59 }
60 x=mm-1;
61 // cout << x << " " << c[i] << endl;
62 while(x>c[i]-(i==0)){
63 d[star]='L';
64 e[star]=jj;
65 x--;
66 jj--;
67 star++;
68 }
69 }else if(mm>c[i]+(i!=0)&&a[mm]>a[mm-1]){
70 int x=mm;
71 while(x>c[i]+(i!=0)){
72 d[star]='L';
73 e[star]=jj;
74 x--;
75 jj--;
76 star++;
77 }
78 x=mm+1;
79 while(x<=c[i+1]){
80 d[star]='R';
81 e[star]=jj;
82 x++;
83 star++;
84 }
85 }else if(b[i]==a[c[i]+1]){
86 continue;
87 }
88 if(!flag){
89 printf("NO
");
90 return 0;
91 }
92 }
93 printf("YES
");
94 for(int j=0; j<star; j++){
95 printf("%d %c
", e[j], d[j]);
96 }
97 }else{
98 printf("NO
");
99 }
100 return 0;
101 }