2014-10-22 22:42:20
花了几个小时做了四道题。
B题大模拟...搞了很久,最后是把繁琐的STL全部去掉才过的TAT。
1 #include <cstdio> 2 #include <cstring> 3 #include <iostream> 4 using namespace std; 5 typedef long long ll; 6 7 int T,n,sz,altop,alpos; 8 struct node{ 9 int p,w; 10 }no[10010]; 11 12 void Move(int pos){ 13 if(alpos && alpos <= pos){ 14 if(alpos == pos) alpos = 1; 15 else alpos++; 16 } 17 node tmp = no[pos]; 18 for(int i = pos; i > 1; --i) 19 no[i] = no[i - 1]; 20 no[1] = tmp; 21 } 22 23 int main(){ 24 int a; 25 char s[20]; 26 scanf("%d",&T); 27 while(T--){ 28 memset(no,0,sizeof(no)); 29 altop = alpos = sz = 0; 30 scanf("%d",&n); 31 for(int Case = 1; Case <= n; ++Case){ 32 printf("Operation #%d: ", Case); 33 scanf("%s",s); 34 if(s[0] == 'A'){ //Add 35 scanf("%d",&a); 36 int flag = 0; 37 for(int i = 1; i <= sz; ++i) if(no[i].p == a){ 38 flag = 1; break; 39 } 40 if(flag){ //已经存在 41 printf("same priority.\n"); 42 continue; 43 } 44 no[++sz].p = a; 45 no[sz].w = 0; 46 printf("success.\n"); 47 } 48 else if(s[0] == 'C' && s[1] == 'l'){ //Close 49 scanf("%d",&a); 50 int pos = 0; 51 for(int i = 1; i <= sz; ++i) if(no[i].p == a){ 52 pos = i; 53 break; 54 } 55 if(pos == 0){ //不存在 56 printf("invalid priority.\n"); 57 continue; 58 } 59 printf("close %d with %d.\n",no[pos].p,no[pos].w); 60 if(alpos > pos) --alpos; 61 for(int i = pos + 1; i <= sz; ++i) 62 no[i - 1] = no[i]; 63 --sz; 64 if(altop == a) altop = alpos = 0; 65 } 66 else if(s[0] == 'C' && s[1] == 'h' && s[2] == 'a'){ //Chat 67 scanf("%d",&a); 68 if(sz == 0){ 69 printf("empty.\n"); 70 continue; 71 } 72 if(altop) no[alpos].w += a; 73 else no[1].w += a; 74 printf("success.\n"); 75 } 76 else if(s[0] == 'R'){ //Rotate 77 scanf("%d",&a); 78 if(a < 1 || a > sz){ 79 printf("out of range.\n"); 80 continue; 81 } 82 Move(a); 83 printf("success.\n"); 84 } 85 else if(s[0] == 'P'){ //Prior 86 if(sz == 0){ 87 printf("empty.\n"); 88 continue; 89 } 90 int pos = 1; 91 for(int i = 1; i <= sz; ++i) if(no[i].p > no[pos].p) 92 pos = i; 93 Move(pos); 94 printf("success.\n"); 95 } 96 else if(s[0] == 'C' && s[1] == 'h' && s[2] == 'o'){ //Choose 97 scanf("%d",&a); 98 int pos = 0; 99 for(int i = 1; i <= sz; ++i) if(no[i].p == a){ 100 pos = i; 101 break; 102 } 103 if(pos == 0){ //不存在 104 printf("invalid priority.\n"); 105 continue; 106 } 107 Move(pos); 108 printf("success.\n"); 109 } 110 else if(s[0] == 'T'){ //Top 111 scanf("%d",&a); 112 int pos = 0; 113 for(int i = 1; i <= sz; ++i) if(no[i].p == a){ 114 pos = i; 115 break; 116 } 117 if(pos == 0){ //不存在 118 printf("invalid priority.\n"); 119 continue; 120 } 121 altop = a; 122 alpos = pos; 123 printf("success.\n"); 124 } 125 else{ //Untop 126 if(alpos == 0){ 127 printf("no such person.\n"); 128 continue; 129 } 130 altop = alpos = 0; 131 printf("success.\n"); 132 } 133 } 134 if(alpos && no[alpos].w) 135 printf("Bye %d: %d\n",altop,no[alpos].w); 136 for(int i = 1; i <= sz; ++i) if(no[i].w && no[i].p != altop) 137 printf("Bye %d: %d\n",no[i].p,no[i].w); 138 } 139 return 0; 140 }