cf378C(模拟)

题目链接: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\n");
 90                 return 0;
 91             }
 92         }
 93         printf("YES\n");
 94         for(int j=0; j<star; j++){
 95             printf("%d %c\n", e[j], d[j]);
 96         }
 97     }else{
 98         printf("NO\n");
 99     }
100     return 0;
101 }

 

转载于:https://www.cnblogs.com/geloutingyu/p/6029690.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值