模拟题。想法是用结构体数组做一个链表。
比赛的时候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 }
G 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 }
H Fractal
J Scores