题意:
给你一个数组A,是否能组成给定的数组B
合成规则:
必须是大数合小数,大数和小数后,大数的值变成大数+小数
合成时数字会自动向前补齐
注意:
合成的时候数字的位置会发生改变
思路:
1.
先从左到右划分一遍数组A,如果不能整分,A数组肯定不能被合成B数组。划分后每个区间对应合成B数组中的一个值
2.
再暴搜每一个小区间,看能不能按规则合成出每个区间要合成的那个数。
同时把搜到的可行的方法保存下来
注意:如果有任何一个区间不能合成直接返回NO
3.
最后输出的时候要注意,由于合成的这个过程,数字的位置发生了变化。
我的方法是假设数字不自动移位,只是在合成的过程中将原来的位置留空。那么我们用树状数组做一下查询就可以知道前面空了几个位置。
原来的位置减去前面的空位置就是当前的位置。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef struct Node{
int pos;
int dir;
Node(int po,int di){
pos=po;
dir=di;
}
}Node;
const int MAXN=600;
int c[MAXN];
int lowbit(int x){
return x&(-x);
}
void modify(int x,int add){
while(x<=MAXN){
c[x]+=add;
x+=lowbit(x);
}
}
int get_sum(int x){
int ret=0;
while(x!=0){
ret+=c[x];
x-=lowbit(x);
}
return ret;
}
int n,a[MAXN],b[MAXN],m;
int st,en,v;
bool dfsflag;
int cuuuut;
int sub[MAXN];
vector <Node> ans[MAXN];
void ini(){
memset(c,0,sizeof(c));
for(int i=0;i<n;i++) scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=0;i<m;i++) scanf("%d",&b[i]);
for(int i=0;i<m;i++)
ans[i].clear();
cuuuut=0;
sub[0]=0;
}
int divi(int cut,int pos){
int sum=0;
for(int i=pos;i<n;i++){
sum+=a[i];
if(sum==cut){
return i+1;
}else if(sum>cut){
return 0;
}
}
return 0;
}
void dfs(int sum,int pos,int le,int ri,vector<Node>way){
if(pos<st||pos>en) return ;
sum+=a[pos];
if(dfsflag||sum==v){
dfsflag=1;
ans[cuuuut++]=way;
return;
}
if(a[le]<sum){
vector<Node>lway=way;
lway.push_back(Node(pos,0));
dfs(sum,le,le-1,ri,lway);
}
if(dfsflag) return ;
if(a[ri]<sum){
vector<Node>rway=way;
rway.push_back(Node(pos,1));
dfs(sum,ri,le,ri+1,rway);
}
return ;
}
bool judge(){
dfsflag=0;
for(int i=st;i<=en;i++){
vector<Node>way;
way.clear();
dfs(0,i,i-1,i+1,way);
if(dfsflag) return 1;
}
return 0;
}
bool sovle(){
int pos=0;
for(int i=0;i<m;i++){
int res=divi(b[i],pos);
if(!res)
return 0;
else{
v=b[i];
st=pos;
en=res-1;
sub[cuuuut+1]=en-st;
if(judge())
pos=res;
else
return 0;
}
}
if(pos==n)
return 1;
return 0;
}
void output(){
for(int i=0;i<m;i++){
vector<Node>::iterator it;
for(it=ans[i].begin();it!=ans[i].end();it++){
if(it->dir){
int pos=it->pos+1;
cout<<pos-get_sum(pos)<<' '<<'R'<<endl;
modify(pos,1);
}
else{
int pos=it->pos+1;
cout<<pos-get_sum(pos)<<' '<<'L'<<endl;
modify(pos,1);
}
}
}
}
int main()
{
while(cin>>n){
ini();
if(!sovle())
cout<<"NO"<<endl;
else{
cout<<"YES"<<endl;
output();
}
}
}