PAT 1061,1062,1063,1064

来源:互联网 发布:网络规划设计师 论文 编辑:程序博客网 时间:2024/05/21 04:01

1061. Dating (20)

分析:
(1)字符串比较处理,第一个需要注意的是理解题意中作为判断的字符条件,DAY是‘A’-‘G’;小时是(‘0’-‘9’,‘A’-‘N’);分钟时(‘A’-‘Z’,’a‘-'z')
(2)第二个理解上我犯的错误,是and the English letter shared by the last two strings is 's' at the 4th position, representing the 4th minute. 我以为是忽略其他符号,数第四个字母,但是结果是因为从第0个开始算。坑。
(3)逻辑与或的括号要看牢
#include<iostream>#include<cstdio>#include<string>using namespace std;int main (){string inpt[4];int i;for (i=0;i<4;i++){cin>>inpt[i];}int day,hour,min;int flag=0;for (i=0;i<inpt[0].size()&&i<inpt[1].size();i++){if (flag==0&&inpt[0][i]==inpt[1][i]&&(inpt[0][i]>='A'&&inpt[0][i]<='G')){flag=1;day=inpt[0][i]-'A';continue;}if (flag==1&&inpt[0][i]==inpt[1][i]&&((inpt[0][i]>='A'&&inpt[0][i]<='N')||(inpt[0][i]>='0'&&inpt[0][i]<='9'))){if (inpt[0][i]>='A'&&inpt[0][i]<='N') hour=inpt[0][i]-'A'+10;if (inpt[0][i]>='0'&&inpt[0][i]<='9') hour=inpt[0][i]-'0';break;}}//int cnt=0;for (i=0;i<inpt[2].size()&&i<inpt[3].size();i++){if((inpt[2][i]>='a'&&inpt[2][i]<='z')||(inpt[2][i]>='A'&&inpt[2][i]<='Z')){if (inpt[2][i]==inpt[3][i]){min=i;break;}}}string D[7]={"MON","TUE","WED","THU","FRI","SAT","SUN"};cout<<D[day];printf(" %02d:%02d\n",hour,min);//return 0;}

1062. Talent and Virtue (25)

分析
(1)和基础题中的德才轮一样,因为看过一遍,所以一些语言陷进就没掉进去,所以英语阅读也是重要的。
(2)用vector和快排即可
#include<cstdio>#include<algorithm>#include<vector>using namespace std;struct people{int ID,V,T;};vector<people> sage;vector<people> noble;vector<people> fool;vector<people> small;bool cmp (people p, people q){if ((p.T+p.V)!=(q.T+q.V))return (p.T+p.V)>(q.T+q.V);else {if (p.V!=q.V)return p.V>q.V;else return p.ID<q.ID;}}int main (){int N,L,H,i;scanf("%d%d%d",&N,&L,&H);for (i=0;i<N;i++){people tmp;scanf("%d%d%d",&tmp.ID,&tmp.V,&tmp.T);if (tmp.T>=L&&tmp.V>=L){if (tmp.T>=H&&tmp.V>=H) sage.push_back(tmp);else if (tmp.V>=H&&tmp.T<H) noble.push_back(tmp);else if (tmp.V<H&&tmp.T<H&&tmp.V>=tmp.T) fool.push_back(tmp);else small.push_back(tmp);}}sort(sage.begin(),sage.end(),cmp);sort(noble.begin(),noble.end(),cmp);sort(fool.begin(),fool.end(),cmp);sort(small.begin(),small.end(),cmp);printf("%d\n",sage.size()+noble.size()+fool.size()+small.size());for (i=0;i<sage.size();i++)printf("%08d %d %d\n",sage[i].ID,sage[i].V,sage[i].T);for (i=0;i<noble.size();i++)printf("%08d %d %d\n",noble[i].ID,noble[i].V,noble[i].T);for (i=0;i<fool.size();i++)printf("%08d %d %d\n",fool[i].ID,fool[i].V,fool[i].T);for (i=0;i<small.size();i++)printf("%08d %d %d\n",small[i].ID,small[i].V,small[i].T);//}

1063. Set Similarity (25)

分析:
(1)hash的思路,但是一开始想用数组,但实在是太大超了,所以就用map,但是感觉有些大材小用。
(2)对迭代器的使用习惯要加强:map<long int, int>::iterator si=hash[a].begin()
(3)迭代器套迭代器思路要清晰
(4)一个基础细节,
float op= (nc*100.0)/(nt*1.0); 如果写成 float op=nc/nt  那么op得不到正确的浮点值
#include<cstdio>#include<iostream>#include<map>#include<vector>using namespace std;int main (){int N,i,j;scanf("%d",&N);vector<map<long int, int> > hash(N);for (i=0;i<N;i++){int M;scanf("%d",&M);vector<long int> mm(M);for (j=0;j<M;j++){scanf("%ld",&mm[j]);hash[i][mm[j]]=1;}}int K;scanf("%d",&K);for (i=0;i<K;i++){int nc=0,nt=0;int a,b;scanf("%d%d",&a,&b);a-=1;b-=1;for (map<long int, int>::iterator si=hash[a].begin();si!=hash[a].end();si++){ //iterator attentionif (hash[b].find(si->first)!=hash[b].end()){nc++;}}nt=hash[b].size()+hash[a].size()-nc;float op= (nc*100.0)/(nt*1.0);   //attetionprintf("%.1f",op);cout<<"%"<<endl;}//return 0;}

1064. Complete Binary Search Tree (30)

分析:
(1)树+递归真心没思路,借鉴了http://blog.csdn.net/iaccepted/article/details/20726067
(2)其中强调了完全二叉树的一个特性,这个特性可以用数组表示树,并有效的得到根节点的key. 遇到完全二叉树要想到这个特点。
(3)先序,中序,后序要熟悉,深度广度要熟悉,
#include<cstdio>#include<algorithm>using namespace std;int ip[1005],op[1005],pos;bool cmp (int p,int q){return p<q;}void build (int root,int n){if (root>n)return;int ls=root*2,rs=root*2+1;build (ls,n);op[root]=ip[pos];pos++;build (rs,n);}int main (){int n,i;scanf("%d",&n);for (i=0;i<n;i++)scanf("%d",&ip[i]);sort(ip,ip+n,cmp);int pos=0;build (1,n);printf ("%d",op[1]);for (i=2;i<=n;i++)printf(" %d",op[i]);//return 0;}



0 0