1、PTA 实验春A. 装箱问题模拟(20) 2B. 表达式转换(25) 7C. 家谱处理(30) 19D. 航空公司VIP客户查询(25) 23E. 社交网络图中结点的“重要性”计算(30) 25F. 奥运排行榜(25) 29A. 装箱问题模拟(20)时间限制 400 ms内存限制 65536 kB代码长度限制 8000 B判题程序 Standard 假设有N项物品,大小分别为s1, s2, , si, , sN,其中si为满足1= si=100的整数。要把这些物品装入到容量为100的一批箱子(序号1N)中。装箱方法是:对每项物品, 顺序扫描箱子,把该物品放入足以能够容下它的第一个箱子中。请写一
2、个程序模拟这种装箱过程,并输出每个物品所在的箱子序号,以及放置全部物品所需的箱子数目。输入格式说明: 输入第1行给出物品个数N(=1000),第2行给出N个正整数si(1 = si = 100,表示第i项物品的大小)。输出格式说明: 按照输入顺序输出每个物品的大小及其所在的箱子序号,每个物品占1行,最后一行输出所需的箱子数目。样例输入与输出:序号输入输出1860 70 80 90 30 40 10 2060 170 280 390 430 140 510 120 2526100 90 80 70 60 50100 190 280 370 460 550 663122 11#includeusi
3、ng namespace std;int main() int N; cinN; int *No=new intN;/存放N个物品各自的大小 int *Box=new intN;/存放箱子的剩余容积,初始100 for(int i=0;itemp1; *(No+i)=temp1; *(Box+i)=100; int boxno=0;for(int ii=0;iiN;ii+)/循环这N个物品for (int j=0;j=0)/判断当前箱子(剩余的容积)是否能够存放第ii+1个物品 cout *(No+ii) j+1endl; if(boxno(j+1)boxno=j+1;/返回最终用到的箱子序号
4、 ,即需要的箱子个数。 *(Box+j)=*(Box+j)-*(No+ii);/记下当前箱子存放完毕后剩余的容积 break;/跳出对当前箱子的循环检查,继续下一个物品 /不能存放则检查下一个箱子。cout boxno endl;delete No;delete Box; return 0;B. 表达式转换(25)时间限制 400 ms内存限制 65536 kB代码长度限制 8000 B判题程序 Standard 算术表达式有前缀表示法、中缀表示法和后缀表示法等形式。日常使用的算术表达式是采用中缀表示法,即二元运算符位于两个运算数中间。请设计程序将中缀表达式转换为后缀表达式。输入格式说明: 输
5、入在一行中给出不含空格的中缀表达式,可包含+、-、*、以及左右括号(),表达式不超过20个字符。输出格式说明: 在一行中输出转换后的后缀表达式,要求不同对象(运算数、运算符号)之间以空格分隔,但结尾不得有多余空格。样例输入与输出:序号输入输出12+3*(7-4)+8/42 3 7 4 - * + 8 4 / +2(2+3)*4-(8+2)/52 3 + 4 * 8 2 + - 5 /31314+25.5*121314 25.5 12 * +4-2*(+3)-2 3 *5123123#include #include #include #include using namespace std;b
6、ool isOper(char c)/判断是否为操作符if (c= +)|(c= -)|(c= *)|(c= /)|(c= ()|(c=)return true;return false;bool isHigh(char top_op,char InfixExp_op)/判断操作符的优先级/top_op为栈顶操作符/InfixExp_op为当前读入操作符/如果栈顶操作符优先级高,则弹出栈顶操作符/如果栈顶操作符优先级低,则压入当前读入操作符if (top_op= +)&(InfixExp_op= +) return true;if (top_op= +)&(InfixExp_op= -) re
7、turn true;if (top_op= -)&(InfixExp_op= +) return true;if (top_op= -)&(InfixExp_op= -) return true;if (top_op= *)&(InfixExp_op= +) return true;if (top_op= *)&(InfixExp_op= -) return true;if (top_op= *)&(InfixExp_op= *) return true;if (top_op= *)&(InfixExp_op= /) return true;if (top_op= /)&(InfixExp_o
8、p= +) return true;if (top_op= /)&(InfixExp_op= -) return true;if (top_op= /)&(InfixExp_op= *) return true;if (top_op= /)&(InfixExp_op= /) return true;if (InfixExp_op= ) return true;return false;void input(vector *InfixExp)char c;cin c;while(c!=n)/判断回车结束输入InfixExp-push_back(c);cin.get(c);/void output
9、(vector *postfixExp)/输出原表达式/vector :iterator postfixExp_it;/后缀表达式迭代器/for(postfixExp_it=postfixExp- begin();postfixExp_it!=postfixExp- end();postfixExp_it+)/ if (isOper(*postfixExp_it)cout *postfixExp_it ;/ else cout *postfixExp_it ;/cout endl;/void output2(vector *postfixExp)/不输出括号/如果表达式中括号不配对/则可能有多
10、余的括号未弹出vector :iterator postfixExp_it;/后缀表达式迭代器for(postfixExp_it=postfixExp- begin();postfixExp_it!=postfixExp- end();postfixExp_it+)if (*postfixExp_it!= ()&(*postfixExp_it!= )if (isOper(*postfixExp_it)cout *postfixExp_it ;else cout *postfixExp_it ;cout endl;int main()stack mystack;vector InfixExp;/
11、中缀表达式vector :iterator InfixExp_it;/中缀表达式迭代器vector postfixExp;/后缀表达式/do /cout 请输入一个表达式,回车结束输入。 endl;cout endl;input(&InfixExp);/output(&InfixExp);/输入表达式for(InfixExp_it=InfixExp.begin();InfixExp_it!=InfixExp.end();InfixExp_it+)if (!isOper(*InfixExp_it)/操作数,直接输出postfixExp.push_back(*InfixExp_it);else/操
12、作符 postfixExp.push_back( );/区分数字用的空格if (mystack.empty()/栈为空,压入操作符mystack.push(*InfixExp_it);else if(isHigh(mystack.top(),*InfixExp_it)/栈顶操作符优先,比如栈顶为*,当前操作符为+,则弹出*if (*InfixExp_it!= )/非闭括号/弹出栈中操作符直到栈顶操作数优先级低于当前读入操作数/压入当前读入操作符dopostfixExp.push_back(mystack.top();mystack.pop();while(!mystack.empty()&(i
13、sHigh(mystack.top(),*InfixExp_it);mystack.push(*InfixExp_it);else/闭括号while(!mystack.empty()&(mystack.top()!= ()/弹出直到开括号postfixExp.push_back(mystack.top();mystack.pop();if (!mystack.empty()&(mystack.top()= ()mystack.pop();/弹出开括号else if(!isHigh(mystack.top(),*InfixExp_it)/中缀表达式中操作符优先/比如栈顶为+,而当前读入*myst
14、ack.push(*InfixExp_it);/压入当前读入操作符while(!mystack.empty()/把栈中剩余的操作符依次弹出postfixExp.push_back(mystack.top();mystack.pop();output2(&postfixExp);while(!mystack.empty()mystack.pop();InfixExp.clear();postfixExp.clear();/清空栈、中缀表达式和后缀表达式/while(true);return 0;带符号的数字运算有误噢。另:本地测试能过,PAT单机版也能过,网络版里通不过。修正版,能通过PAT,测
15、试可用。PS:这个是网上下载的,下载地址附上#include#include#includeusing namespace std;stack s;int Judge(char a) if(a=+)|(a=-)|(a=*)|(a=/)|(a=()|(a=) return 1; return 0;int Judge_(char b,char a) if(b=+|b=-) if(a=+)|(a=-)|(a=*)|(a=/)|(a=() return 1; return 0;int Judge_jjcc(char a) if(a=+)|(a=-)|(a=*)|(a=/) return 1; retu
16、rn 0;int Judge_jj(char a) if(a=+)|(a=-) return 1; return 0;int premer(char a,char b) switch(a) case +: switch(b) case +:return 0;break; case -:return 0;break; case *:return 0;break; case /:return 0;break; case (:return 0;break; break; case-: switch(b) case +:return 0;break; case -:return 0;break; ca
17、se *:return 0;break; case /:return 0;break; case (:return 0;break; break; case *: switch(b) case +:return 1;break; case -:return 1;break; case *:return 0;break; case /:return 0;break; case (:return 0;break; break; case/: switch(b) case +:return 1;break; case -:return 1;break; case *:return 0;break;
18、case /:return 0;break; case (:return 0;break; break; case(: switch(b) case +:return 0;break; case -:return 0;break; case *:return 0;break; case /:return 0;break; case (:return 0;break; break; default:break; int main() char a30; scanf(%s,a); int len=strlen(a); int con_flag=0; int op_flag=1; bool firs
19、t=false; for(int i=0;ilen;i+) if(Judge(ai)&(!(i=0&Judge_jj(ai)&(!Judge_(ai,ai-1) /正常符号 if(ai=) while(s.top()!=() char temp=s.top(); s.pop(); cout temp; s.pop(); while(!s.empty()&s.top()!=() char temp_t=s.top(); s.pop(); cout temp_t; else if(!s.empty()&(ai!=() if(premer(s.top(),ai) con_flag=1; else c
20、on_flag=0; while(con_flag)/压入的操作符优先级要大于顶部元素 char temp2=s.top(); cout temp2; s.pop(); if(!s.empty() if(premer(s.top(),ai) con_flag=1; else con_flag=0; else con_flag=0; s.push(ai); else s.push(ai); if(first=false&Judge_jjcc(ai) first=true; cout ; else if(ai=+|ai=-)/表示数据的正负 if(ai=-) op_flag*=-1; /是-号 后
21、面的数字乘以-1; /否则忽略 first=true; else if(i=0) coutai; else if(op_flag=-1) cout-ai; op_flag=1; else coutai; first=false;/遇到数字 while(!s.empty() cout s.top(); s.pop(); /printf(%s,a); system(pause); return 0;另外再提供一个,未经测试的,代码就不贴了,自己下载测试。,C. 家谱处理(30)时间限制400 ms内存限制65536 kB代码长度限制8000 B判题程序Standard人类学研究对于家族很感兴趣,于
22、是研究人员搜集了一些家族的家谱进行研究。实验中,使用计算机处理家谱。为了实现这个目的,研究人员将家谱转换为文本文件。下面为家谱文本文件的实例:John Robert Frank Andrew Nancy David家谱文本文件中,每一行包含一个人的名字。第一行中的名字是这个家族最早的祖先。家谱仅包含最早祖先的后代,而他们的丈夫或妻子不出现在家谱中。每个人的子女比父母多缩进2个空格。以上述家谱文本文件为例,John这个家族最早的祖先,他有两个子女Robert和Nancy,Robert有两个子女Frank和Andrew,Nancy只有一个子女David。在实验中,研究人员还收集了家庭文件,并提取了
23、家谱中有关两个人关系的陈述语句。下面为家谱中关系的陈述语句实例:John is the parent of RobertRobert is a sibling of NancyDavid is a descendant of Robert研究人员需要判断每个陈述语句是真还是假,请编写程序帮助研究人员判断。输入格式说明:输入首先给出2个正整数N(2=N=100)和M(=100),其中N为家谱中名字的数量,M为家谱中陈述语句的数量,输入的每行不超过70个字符。名字的字符串由不超过10个英文字母组成。在家谱中的第一行给出的名字前没有缩进空格。家谱中的其他名字至少缩进2个空格,即他们是家谱中最早祖先(
24、第一行给出的名字)的后代,且如果家谱中一个名字前缩进k个空格,则下一行中名字至多缩进k+2个空格。在一个家谱中同样的名字不会出现两次,且家谱中没有出现的名字不会出现在陈述语句中。每句陈述语句格式如下,其中X和Y为家谱中的不同名字:X is a child of YX is the parent of YX is a sibling of YX is a descendant of YX is an ancestor of Y输出格式说明:对于测试用例中的每句陈述语句,在一行中输出True,如果陈述为真,或False,如果陈述为假。样例输入与输出:序号输入输出16 5John Robert Fr
25、ank Andrew Nancy DavidRobert is a child of JohnRobert is an ancestor of AndrewRobert is a sibling of NancyNancy is the parent of FrankJohn is a descendant of AndrewTrueTrueTrueFalseFalse22 1abc abcdefghijabcdefghij is a child of abcTrue34 5A B C DA is a child of DD is the parent of CC is a sibling of BD is a descendant of BB is an ancestor of CFalseFalseFalseTrueTrue# 家谱处理 PAT4-05. 家谱处理-1#include#include#include#include#includeusing namespace std;struct node string name; int level,pre; node() node(string s,int a,int b):pre(b),level(a),name(s);dequedequetr(101);unordered_map
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1