zoukankan      html  css  js  c++  java
  • 2015 ACM/ICPC Asia Regional Beijing Online

    The Cats' Feeding Spots

    Mission Impossible 6

    模拟题。想法是用结构体数组做一个链表。

    比赛的时候WA了。说一下几个注意点。

    1.光标到头的时候不能再动了。

    2.字符总数不能超过M,如果V操作溢出则不执行V操作(而不是粘贴部分)。

    3.复制的时候有左右方向。

    4.复制状态下进行了除L/R/D以外的操作则停止复制。注意!!此时不更新剪贴板。

    5.每次操作之后记得更新光标的位置。

    6.每个Case初始化各种变量时,串与剪贴板清空。

    反思:比赛的时候思路不是很清晰,代码没有模块化。用IDE调也不熟练。(或许该换一个了

    这是赛后重写的版本。

      1 # include <iostream>
      2 # include <cstdio>
      3 # include <cstring>
      4 using namespace std;
      5 const int maxn=11111;
      6 char op[maxn],cpy[maxn],buff[maxn];
      7 // 操作 剪贴板 缓存区 
      8 int M,len_op,cnt_str,F,L,pos,cp1;
      9 // 长度限制 操作长度 字符池大小 光标前字符数 当前总字符数 光标位置 复制起始位置 
     10 int cnt_buff,dir_cpy;
     11 // 缓存区字符数 复制方向 
     12 bool ins,on;
     13 // 输入模式 复制开关 
     14 
     15 struct node//链表保存字符 记录前后节点下标 
     16 {
     17     char c;
     18     int l,r;
     19 } str[2*maxn];
     20 
     21 void Init(void)
     22 {
     23     memset(str,0,sizeof(str));
     24     memset(cpy,0,sizeof(cpy));
     25     scanf("%d%s",&M,op);
     26     len_op=strlen(op),cnt_str=F=L=pos=0;
     27     cnt_buff=dir_cpy=0;
     28     ins=1,on=0;
     29     return;
     30 }
     31 
     32 void Move(int type)//复制时光标移动更新选中区域 
     33 {
     34     if(type*dir_cpy>=0)
     35     {
     36         buff[cnt_buff++]=str[pos].c;
     37         dir_cpy=type;
     38     }
     39     else
     40     {
     41         buff[cnt_buff--]=0;
     42         if(cnt_buff==0) dir_cpy=0;
     43     }
     44     return;
     45 }
     46 
     47 void Delete(int ll,int rr)//链表删除一段字符 
     48 {
     49     str[ll].r=str[rr].r;
     50     if(str[rr].r) str[str[rr].r].l=ll;
     51     pos=ll;
     52     return;
     53 }
     54 
     55 void get_buff(void)//从缓存区更新剪贴板 
     56 {
     57     if(dir_cpy>0) for(int i=0;i<cnt_buff;i++)
     58         cpy[i]=buff[i];
     59     if(dir_cpy<0) for(int i=0;i<cnt_buff;i++)
     60         cpy[i]=buff[cnt_buff-i-1];
     61     cpy[cnt_buff]=0;
     62     return;
     63 }
     64 
     65 void Insert(char* s,int tmp)//光标位置插入tmp个字符 
     66 {
     67     L+=tmp; F+=tmp;
     68     for(int i=0;i<tmp;i++)
     69     {
     70         str[++cnt_str].c=s[i];
     71         if(str[pos].r)
     72         {
     73             str[cnt_str].r=str[pos].r;
     74             str[str[pos].r].l=cnt_str;
     75         }    
     76         str[pos].r=cnt_str;
     77         str[cnt_str].l=pos;
     78         pos=cnt_str;
     79     }
     80     return;
     81 }
     82 
     83 void Overwrite(char* s,int tmp)//光标位置改写tmp个字符 
     84 {
     85     F+=tmp;
     86     for(int i=0;i<tmp;i++)
     87     {
     88         if(str[pos].r)
     89         {
     90             pos=str[pos].r;
     91             str[pos].c=s[i];
     92         }
     93         else
     94         {
     95             L++;
     96             str[++cnt_str].c=s[i];
     97             str[pos].r=cnt_str;
     98             str[cnt_str].l=pos;
     99             pos=cnt_str;
    100         }
    101     }
    102     return;
    103 }
    104 
    105 void Solve(void)
    106 {
    107     for(int i=0;i<len_op;i++)
    108     {
    109         if(op[i]=='L') 
    110         {
    111             if(pos)
    112             {    
    113                 F--;
    114                 if(on) Move(-1);
    115                 pos=str[pos].l;
    116             }
    117         }
    118         else if(op[i]=='R')
    119         {
    120             if(str[pos].r)
    121             {
    122                 F++;
    123                 pos=str[pos].r;
    124                 if(on) Move(1);
    125             }
    126         }
    127         else if(op[i]=='S') {ins=!ins;on=0;}
    128         else if(op[i]=='D')
    129         {
    130             if(on&&cnt_buff)
    131             {
    132                 if(dir_cpy>0) Delete(cp1,pos),F-=cnt_buff;
    133                 else Delete(pos,cp1);
    134                 L-=cnt_buff; on=0;
    135             }
    136             else if(!on&&str[pos].r) Delete(pos,str[pos].r),L--;
    137         }
    138         else if(op[i]=='B')
    139         {
    140             if(pos) Delete(str[pos].l,pos),L--,F--;
    141             on=0;
    142         }
    143         else if(op[i]=='C')
    144         {
    145             if(!on)
    146             {
    147                 on=1; cp1=pos;
    148                 cnt_buff=dir_cpy=0;
    149             }
    150             else get_buff(),on=0;
    151         }
    152         else if(op[i]=='V')
    153         {
    154             int tmp=strlen(cpy);
    155             if(ins&&tmp+L<=M) Insert(cpy,tmp);
    156             else if(!ins&&F+tmp<=M) Overwrite(cpy,tmp);
    157             on=0;
    158         }
    159         else
    160         {
    161             if(ins&&L<M) Insert(op+i,1);
    162             if(!ins&&F<M) Overwrite(op+i,1);
    163             on=0;
    164         }
    165     }
    166     return;
    167 }
    168 
    169 void ans_print(void)
    170 {
    171     if(!L) puts("NOTHING");
    172     else
    173     {
    174         int p=str[0].r;
    175         while(p)
    176         {
    177             printf("%c",str[p].c);
    178             p=str[p].r;
    179         }
    180         puts("");
    181     }
    182     return;
    183 }
    184 
    185 int main(void)
    186 {
    187     int T; cin>>T;
    188     while(T--)
    189     {
    190         Init();
    191         Solve();
    192         ans_print();
    193     }
    194     return 0;
    195 }
    Aguin

    Protecting Homeless Cats

    The Celebration of Rabbits

    Border Length

    Couple Trees

    Boxes

    直接暴力BFS就过了。不知赛时队内在纠结什么。

     1 # include <iostream>
     2 # include <cstdio>
     3 # include <cstring>
     4 # include <algorithm>
     5 # include <queue>
     6 using namespace std;
     7 # define CLR(x) memset(x,0,sizeof(x))
     8 typedef pair<int,int> pii;
     9 const int maxn=1000000;
    10 int val[8]={0,1},box[7],ans[8][maxn];
    11 queue <pii> q;
    12 
    13 struct node
    14 {
    15     int id,v;
    16     friend bool operator < (node x,node y)
    17     {
    18         return x.v<y.v;
    19     }
    20 } V[7];
    21 
    22 void get_box(int cur)
    23 {
    24     CLR(box);
    25     for(int i=7;i;i--)
    26     {
    27         int id=cur/val[i];
    28         box[id]=i;
    29         cur%=val[i];
    30     }
    31     return;
    32 }
    33 
    34 int get_cur(int n)
    35 {
    36     int ret=0;
    37     sort(V,V+n);
    38     for(int i=0;i<n;i++) ret+=val[i+1]*V[i].id;
    39     return ret;
    40 }
    41 
    42 void preprocess(void)
    43 {
    44     memset(ans,-1,sizeof(ans));
    45     for(int i=2;i<=7;i++) val[i]=val[i-1]*7;
    46     for(int n=1;n<=7;n++)
    47     {
    48         int cur=0,t=0;
    49         for(int i=0;i<n;i++) cur+=i*val[i+1];
    50         ans[n][cur]=0;
    51         while(!q.empty()) q.pop();
    52         q.push(pii(cur,0));
    53         while(!q.empty())
    54         {
    55             pii tmp=q.front(); q.pop();
    56             cur=tmp.first,t=tmp.second;
    57             get_box(cur);
    58             for(int i=0;i<n;i++)
    59             {
    60                 if(!box[i]) continue;
    61                 if(i&&(!box[i-1]||box[i]<box[i-1]))
    62                 {
    63                     int Next=cur-i*val[box[i]]+(i-1)*val[box[i]];
    64                     if(ans[n][Next]<0) {ans[n][Next]=t+1; q.push(pii(Next,t+1));}
    65                 }
    66                 if(i<n-1&&(!box[i+1]||box[i]<box[i+1]))
    67                 {
    68                     int Next=cur-i*val[box[i]]+(i+1)*val[box[i]];
    69                     if(ans[n][Next]<0) {ans[n][Next]=t+1; q.push(pii(Next,t+1));}
    70                 }
    71             }
    72         }
    73     }
    74     return;
    75 }
    76 
    77 int main(void)
    78 {
    79     preprocess();
    80     int T; cin>>T;
    81     while(T--)
    82     {
    83         int n; scanf("%d",&n);
    84         for(int i=0;i<n;i++)
    85         {
    86             scanf("%d",&V[i].v);
    87             V[i].id=i;
    88         }
    89         int cur=get_cur(n);
    90         printf("%d
    ",ans[n][cur]);
    91     }
    92     return 0;
    93 }
    Aguin

    Fractal

    New Teaching Buildings

    Scores

  • 相关阅读:
    Docker私有仓库
    Swarm配置文件管理
    Docker Swarm高可用性
    Docker集群管理Swarm数据持久化
    Swarm使用原生的overlay网络
    Docker Swarm集群部署
    Docker管理工具-Swarm
    Docker多主机网络 OpenvSwitch
    Docker网络 Weave
    Docker Macvlan
  • 原文地址:https://www.cnblogs.com/Aguin/p/4825531.html
Copyright © 2011-2022 走看看