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\n",ans[n][cur]);
91     }
92     return 0;
93 }
Aguin

 

Fractal

 

New Teaching Buildings

 

Scores

 

posted @ 2015-09-21 11:00  Aguin  阅读(230)  评论(0编辑  收藏  举报