题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=4049
题解:题目要求判断是否会停止,r的状态共256种,i的状态共1e5种,用一个二维数组来标记状态,保证每个状态只出现一次,若出现两次,则会出现循环;
读题后先判断题目的状态数,根据状态数,计算复杂度,设计合适的算法;
细节问题:开始忘了加else,导致前面的 i f 改变了 i,后面又进入 i f 时 i 的值已被改变,不要手懒不写else;
#include<cstdio> #include<cstring> typedef struct NODE{ char s[10]; int v; int k; } Node; Node step[10005]; int vis[260][10005]; int main() { int T; scanf("%d",&T); while(T--) { int m; int r = 0; int flag = 0; memset(vis,0,sizeof(vis)); scanf("%d",&m); for(int i = 1;i <= m;i++) { char st[3]; scanf("%s",st); int vt; scanf("%d",&vt); if(st[1] == 'd') //如果是add只有2个成员 { strcpy(step[i].s,st); step[i].v = vt; } else { int kt; scanf("%d",&kt); strcpy(step[i].s,st); step[i].v = vt; step[i].k = kt; } } int i = 1; while(i <= m) { if(step[i].s[1] == 'd') { r = (r + step[i].v) % 256; i++; } else if(step[i].s[1] == 'e') { if(r == step[i].v) i = step[i].k; else i++; } else if(step[i].s[1] == 'n') { if(r != step[i].v) i = step[i].k; else i++; } else if(step[i].s[1] == 'l') { if(r < step[i].v) i = step[i].k; else i++; } else if(step[i].s[1] == 'g') { if(r > step[i].v) i = step[i].k; else i++; } if(vis[r][i] != 0) { printf("No "); flag = 1; break; } vis[r][i] = 1; } if(flag == 0) { printf("Yes "); } } return 0; }