先看UVA11995
两份代码一份直接用C写的,一份用STL写的
#include <iostream> #include <stdio.h> #include <string.h> #include <queue> #include <stack> //#include <priority_queue> using namespace std; int a[1005]; int b[1005]; int c[1005]; struct ope { int x; int y; }op[1005]; int v[4];//1队列 2栈 3优先队列 int main() { int n; while(scanf("%d",&n)!=EOF) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); memset(v,0,sizeof(v)); int cnt1=0,cnt2=0,cnt3=0; for(int i=0;i<n;i++) { scanf("%d%d",&op[i].x,&op[i].y); } for(int i=0;i<n;i++) { if(op[i].x==1) { a[cnt1++]=op[i].y; } if(op[i].x==2) { if(cnt1-1<0) { v[1]=1;} else { int temp=0; for(int jj=0;jj<cnt1;jj++) { if(a[jj]==0){temp++; continue ;} else { if(a[jj]==op[i].y) { a[jj]=0; break; } else {v[1]=1;break;} } } if(temp==cnt1) v[1]=1; } } if(op[i].x==1) { b[cnt2++]=op[i].y; } if(op[i].x==2) { int temp=0; if(cnt2-1<0) {v[2]=1;} else { for(int jj=cnt2-1;jj>=0;jj--) { if(b[jj]==0) {temp++;continue;} else { if(b[jj]==op[i].y) {b[jj]=0;break;} else v[2]=1;break; } } if(temp==cnt2) {v[2]=1;} } } if(op[i].x==1) { c[cnt3++]=op[i].y; } if(op[i].x==2) { if(cnt3-1<0) v[3]=1; else { int temp3,max=-1; for(int jj=0;jj<cnt3;jj++) if(c[jj]>max){temp3=jj; max=c[jj];} if(max==op[i].y) c[temp3]=0; else v[3]=1; } } } if(!v[1]&&v[2]==1&&v[3]==1) printf("queue\n"); else if(v[1]==1&&!v[2]&&v[3]==1) printf("stack\n"); else if(v[1]==1&&v[2]==1&&!v[3]) printf("priority queue\n"); else if(v[1]==1&&v[2]==1&&v[3]==1) printf("impossible\n"); else printf("not sure\n"); } return 0; } STL版~ #include<cstdio> #include<stack> #include<queue> using namespace std; const int maxn = 1000+100; int id[maxn],x[maxn],n; bool isStack(){ stack<int> s; for(int i=0;i<n;i++){ if(id[i]==1) s.push(x[i]); else{ if(s.empty()) return false; int val=s.top(); s.pop(); if(x[i]!=val) return false; } } return true; } bool isQueue(){ queue<int >q; for(int i=0;i<n;i++){ if(id[i]==1) q.push(x[i]); else{ if(q.empty()) return false; int val=q.front(); q.pop(); if(x[i]!=val) return false; } } return true; } bool isPriority(){ priority_queue<int > q; for(int i=0;i<n;i++){ if(id[i]==1) q.push(x[i]); else{ if(q.empty()) return false; int val=q.top(); q.pop(); if(x[i]!=val) return false; } } return true; } int main(){ while(scanf("%d",&n)!=EOF){ bool st=false,qu=false,pr=false; for(int i=0;i<n;i++){ scanf("%d %d",&id[i],&x[i]); } st=isStack(); qu=isQueue(); pr=isPriority(); if(!st&&!qu&&!pr) puts("impossible"); else if((!st&&qu&&pr)||(!qu&&st&&pr)||(!pr&&qu&&st)||pr&&qu&&st){ puts("not sure"); } else if(st) puts("stack"); else if(qu) puts("queue"); else if(pr) puts("priority queue"); } return 0; }
queue,stack,priority_queue取顶部or底部元素,front,top,back,push,pop.......
接下来是UVA11991
附代码
:
#include<iostream> #include<vector> #include<map> #include<stdio.h> using namespace std; map<int,vector<int> > a; int main() { int n,m,x,y; while(scanf("%d%d",&n,&m)==2) { a.clear(); for(int i=0;i<n;i++) { scanf("%d",&x); if(!a.count(x)) a[x]=vector<int>(); a[x].push_back(i+1); } while(m--) { scanf("%d%d",&x,&y); if(!a.count(y)||a[y].size()<x) printf("0\n"); else printf("%d\n",a[y][x-1]); } } return 0; }
map,vector用法。。
map里面的count用法。。