点击打开链接
UVA 442 Matrix Chain Multiplication
#include<cstdio> #include<iostream> #include <list> #include <vector> #include <stack> #include <cstring> using namespace std; struct node { int a; int b; }; int multi(node a, node b) { if (a.b == b.a) return a.a * a.b * b.b; else return -1; } int main() { freopen("input.txt", "r", stdin); int t; node letter[27]; char xxx[100]; scanf("%d%*c", &t); for (int i = 0; i < t; i++) scanf("%*c %d %d%*c", &letter[i].a, &letter[i].b); while (gets(xxx)) { int sum = 0; node temp = {0, 0}; bool submark = 0,doitnow=0; stack< node > stack1,stack2; for (int i = strlen(xxx) - 1; i >= 0; i--) { if (xxx[i] == ')') { submark=true; if(doitnow==true){ doitnow=false; stack2.push(temp); } } else if(submark==true){ stack1.push(letter[xxx[i]-'A']); submark=false; } else if(isalpha(xxx[i])){ if(doitnow==true){ if (multi(letter[xxx[i]-'A'],temp) == -1) { printf("error\n"); goto done; } else { sum += multi(letter[xxx[i]-'A'],temp); temp.a = letter[xxx[i]-'A'].a; } doitnow=false; continue; } temp = letter[xxx[i] - 'A']; while (!stack1.empty()) { if (multi(temp, stack1.top()) == -1) { printf("error\n"); goto done; } else { sum += multi(temp, stack1.top()); temp.b = stack1.top().b; stack1.pop(); } } } else{ doitnow=true; } } while (!stack2.empty()) { if (multi(temp, stack2.top()) == -1) { printf("error\n"); goto done; } else { sum += multi(temp, stack2.top()); temp.b = stack2.top().b; stack2.pop(); } } printf("%d\n",sum); done:; } return 0; }
UVA 11111 Generalized Matrioshkas
#include<cstdio> #include<iostream> #include <list> #include <vector> #include <stack> #include <cstring> using namespace std; struct node{ int a; int val; }; stack<node> st; int main() { freopen("input.txt", "r", stdin); int aaa; char letter; bool shibai=0; while(scanf("%d%c",&aaa,&letter)==2){ node temp; temp.a=aaa; temp.val=-aaa; if(aaa<0){ if(st.empty()) st.push(temp); else{ if(st.top().val<=(-aaa)) shibai=true; st.top().val+=aaa; st.push(temp); } } else{ if(st.empty()||(aaa+st.top().a)!=0) shibai=true; else st.pop(); } if(letter=='\n'){ if(shibai==true||!st.empty()){ printf(":-( Try again.\n"); while(!st.empty()) st.pop(); shibai=false; } else printf(":-) Matrioshka!\n"); } } return 0; }
UVA 11234 Expressions
#include <cstdio> #include <cstring> #include <iostream> #include <stack> #include <list> #include <algorithm> #include <queue> using namespace std; struct node{ char val; node *left; node *right; }; queue<node*> que; stack<node*> st; int main() { freopen("input.txt","r",stdin); int t,len; node* temp; char str[10001]; scanf("%d%*c",&t); while(t--){ gets(str); len=strlen(str); for(int i=0;i<len;i++) { if(islower(str[i])){ temp=new node; temp->val=str[i]; temp->right=temp->left=NULL; st.push(temp); } else{ temp=new node; temp->val=str[i]; temp->right=st.top(); st.pop(); temp->left=st.top(); st.pop(); st.push(temp); } } int i=0; node* cur=st.top(); que.push(cur); while(!que.empty()){ cur=que.front(); que.pop(); if(cur->left) que.push(cur->left); if(cur->right) que.push(cur->right); str[i++]=cur->val; } for(int i=len-1;i>=0;i--) printf("%c",str[i]); printf("\n"); while(!st.empty()) st.pop(); } return 0; }
UVA 540 Team Queue
#include<cstdio> #include<iostream> #include <list> #include <vector> #include <stack> #include <cstring> #include <algorithm> using namespace std; int t; vector<int> teams[1001]; struct node{ int mem; int team; }; list<node> que; int findteam[1000001]; int main() { freopen("input.txt", "r", stdin); int cas=1; list<node>::iterator teampos[1001]; while (scanf("%d%*c", &t), t) { que.clear(); for(int i=0;i<t;i++) teampos[i]=que.end(); printf("Scenario #%d\n",cas++); for (int i = 0; i < t; i++) { vector<int> temp; int teammate; scanf("%d%*c", &teammate); while (teammate--) { int menber; scanf("%d%*c", &menber); temp.push_back(menber); findteam[menber]=i; } teams[i] = temp; } char command[20]; while(scanf("%s%*c",command),command[0]!='S'){ if(command[0]=='E'){ node enqmem; scanf("%d%*c",&enqmem.mem); enqmem.team=findteam[enqmem.mem]; if(teampos[enqmem.team]==que.end()){ que.push_back(enqmem); teampos[enqmem.team]=--que.end(); } else{ que.insert(++teampos[enqmem.team],enqmem); teampos[enqmem.team]--; } } else{ for(int i=0;i<t;i++) if(teampos[i]==que.begin()) teampos[i]=que.end(); printf("%d\n",que.front().mem); que.pop_front(); } } printf("\n"); } return 0; }