思路:
题目我觉得可以分为数学思想加上模拟,就是一个细节比较麻烦的模拟题。大概的思路,现在按步骤做
1.两个数列总和是否相等(这个必须,后面可能出现第二个数列都匹配好了但是第一列还有节余的情况)
2.用贪心的思路将第一列分段,将左右坐标记录一下
3.之后排除一种情况,就是一段中全都是一样的·数,这里注意一下,只有一个是不需要吃的,所以要特判一下
4.之后说明一定没问题了,那么我们挨个移动就好,这里有个小技巧,我们先挪动后面的对前面的坐标是没影响的,那么我们倒着遍
历。处理的时候也要特判长度是1,2和其他的,还有边界啥的。。。自己好好想才能想清楚。(提示挪动的时候,先向后移动的话输出的位置是不需要变得,向前则是递减到2即可)
上我的丑代码
#include<bits/stdc++.h>
#define input freopen("input.txt","r",stdin)
using namespace std;
long long a[505],good[505];
int ok[505][2];
void handle(long long l,long long r){
int i,j,p,maxx=0;
if(l==r) return ; //长度为1,不需要处理
if(r-l==1){ //长度为2
if(a[l]>a[r]) cout<<l<<" R"<<endl;
else cout<<r<<" L"<<endl;
return ;
}
if(a[l]>a[l+1]){ //长度为2以上,这里特别处理最两端
p=l;
maxx=a[l];
}
if(a[r]>a[r-1]&&a[r]>maxx){
maxx=a[r];
p=r;
}
for(i=l+1;i<=r-1;i++){ //找到最大位置,且左右不是都相等 1 2 2情况取第二个
if((a[i]>a[i-1]||a[i]>a[i+1])&&a[i]>maxx){
maxx=a[i];
p=i;
}
}
if(p==l){ //最大值在最左边
for(j=l+1;j<=r;j++){
cout<<l<<" R"<<endl;
}
}
else if(p==r){ //最大值在最右边
for(j=r;j>l;j--){
cout<<j<<" L"<<endl;
}
}
else{
if(a[p]>a[p+1]){ //先向右再向左
for(j=p+1;j<=r;j++){
cout<<p<<" R"<<endl;
}
for(j=p;j>l;j--){
cout<<j<<" L"<<endl;
}
}
else{ //先向左再向右
for(j=p;j>l;j--){
cout<<j<<" L"<<endl;
}
for(j=p+1;j<=r;j++){
cout<<l<<" R"<<endl;
}
}
}
}
int main(){
input;
int n,start,end,k,flag;
int i,j;
while(scanf("%d",&n)!=EOF){
flag=1;
long long key1=0,key2=0;
memset(good,0,sizeof(good));
memset(a,0,sizeof(a));
memset(ok,0,sizeof(ok));
for(i=1;i<=n;i++){
scanf("%I64d",&a[i]);
key1+=a[i];
}
scanf("%d",&k);
for(i=1;i<=k;i++){
scanf("%I64d",&good[i]);
key2+=good[i];
}
if(key1!=key2){ //步骤一
cout<<"NO"<<endl;
continue;
}
long long sum=0,pos=1;
start=1;end=0;
for(i=1;i<=n;i++){ //步骤二
sum+=a[i];
if(sum<=good[pos]){
end++;
if(sum==good[pos]){
ok[pos][0]=start;
ok[pos][1]=end;
pos++;
sum=0;
end=i;
start=i+1;
}
}
else{
flag=0;
break;
}
}
if(flag==0){
cout<<"NO"<<endl;
continue;
}
for(i=1;i<pos;i++){ //步骤三
long long check=a[ok[i][0]],tmp=0;
if(ok[i][0]==ok[i][1]){
continue;
}
for(j=ok[i][0]+1;j<=ok[i][1];j++){
if(a[j]!=check){
tmp=1;
break;
}
}
if(tmp==0){
flag=0;
break;
}
}
if(flag==0){
cout<<"NO"<<endl;
continue;
}
cout<<"YES"<<endl;
for(i=pos-1;i>=1;i--){ //步骤四
handle(ok[i][0],ok[i][1]);
}
}
return 0;
}