UVA 11111 Generalized Matrioshkas
题意是 一种玩具的匹配,一个玩具由一对绝对值相同的数字构成,一个玩具里面可以塞体积小于他的一个或多个玩具。
题目要求判断某个组合方式是否合理,比如-3 -1 1 3意味着在一个体积为3的玩具里放一个体积为1的玩具 ,合理, 如果 为 -3 -2 -1 2 1 3 或者 -3 -3 3 3,则不合理,前者是对应玩具没有正确配对,后者因内部玩具体积过大所以不合理。
我先用一个模拟栈判断序列式否合理,若合理,则进行下一步体积的判断。
对于一个玩具,要考虑他内部的玩具体积是否合理,可以将玩具根据位置设定等级,等级0表示最外层,以此类推,然后进行判断的时候,只要考虑计算他右侧直到遇到等级和他相同或等级小于他的目标即可,即在右侧且等级小于等于他的个体与它一定是相互分离不嵌套的玩具。
#include<algorithm> #include<iostream> #include<cstring> #include<cstdio> #include<vector> using namespace std; const int MAXN=10005; int a[MAXN], st[MAXN]; struct aaa { int r, v; } doll[MAXN]; int main() { int t=0, k, i, j, rank; char p; while(scanf("%d%c",&a[t++],&p)!=EOF) { if(p=='\n') { k=0; for(i=0; i<t; i++) { if(a[i]<0) st[k++]=a[i]; else if(k>0&&a[i]==-st[k-1]) { k--; } else break; } if(i!=t||k!=0) { printf(":-( Try again.\n"); } else { k=0, rank=0; for(i=0; i<t; i++) { if(a[i]<0) { doll[k].r=rank, doll[k].v=-a[i]; k++, rank++; } else { rank--; } } bool flag=true; for(i=0; i<k; i++) { int sum=0; for(j=i+1; j<k; j++) { if(doll[i].r>=doll[j].r) break; if(doll[i].r+1==doll[j].r) sum+=doll[j].v; if(doll[i].v<=sum) { flag=false; break; } } if(!flag) break; } if(flag) printf(":-) Matrioshka!\n"); else printf(":-( Try again.\n"); } t=0; } } return 0; }