题目地址:http://pat.zju.edu.cn/contests/pat-a-practise
1061:
给四个字符串,前两个串第一个公共的大写字母A~G表示周一到周日,前两个串第二个公共字母0~9,A~N表示时间到0~23(hour)。后两个串的第一个公共英文字符所在的位置数组下标,表示秒。输出即可。
代码:
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> #include<string> #include<map> using namespace std; char weekday[8][5]={"MON","TUE","WED","THU","FRI","SAT","SUN"}; int isabc(char x) { if(x>='a'&&x<='z') return 1; if(x>='A'&&x<='Z') return 1; return 0; } int main() { int week,hour,mini; int i,j; char str1[105],str2[105]; while(cin>>str1>>str2) { int len=strlen(str1); for(i=0;i<len;i++) { if(str1[i]==str2[i]&&str1[i]>='A'&&str1[i]<='G') { week=str1[i]-'A'; break; } } for(j=i+1;j<len;j++) { if(str1[j]==str2[j]) { if(str1[j]>='0'&&str1[j]<='9') { hour=str1[j]-'0'; break; } else if(str1[j]>='A'&&str1[j]<='N') { hour=str1[j]-'A'+10; break; } } } cin>>str1>>str2; len=strlen(str1); for(i=0;i<len;i++) { if(str1[i]==str2[i]&&isabc(str1[i])) { mini=i; break; } } printf("%s %02d:%02d\n",weekday[week],hour,mini); } return 0; } /* 3485djDkxh4hhGE 2984akDfkkkkggEdsb s&hgsfdk d&Hyscvnm */
1062:
一个low值,一个high值
每个人有两个值,
1.如果两个值都大于high,是圣人,最先排序。
2.第一个值大于high的,第二排序。
3.如果第二个值大于第一个值,是小人,应该最后排序。
4.剩下的都第三排序。
代码:
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<string> #include<algorithm> #include<map> const int maxn = 100005; using namespace std; int low,high; struct node { int g1; int g2; int total; int index; }nod[maxn]; int getnum(node p1) { if(p1.g1>=high&&p1.g2>=high) return 1; if(p1.g2>p1.g1) return 4; if(p1.g1>=high) return 2; return 3; } int cmp(node p1,node p2) { if(getnum(p1)<getnum(p2)) return 1; if(getnum(p1)==getnum(p2)&&p1.total>p2.total) return 1; if(getnum(p1)==getnum(p2)&&p1.total==p2.total&&p1.g1>p2.g1) return 1; if(getnum(p1)==getnum(p2)&&p1.total==p2.total&&p1.g1==p2.g1&&p1.index<p2.index) return 1; return 0; } int main() { int n; int i; while(cin>>n>>low>>high) { int x,y,z; int tes=1; for(i=1;i<=n;i++) { cin>>x>>y>>z; if(y<low||z<low) continue; nod[tes].g1=y,nod[tes].g2=z; nod[tes].total=y+z; nod[tes++].index=x; } n=tes; cout<<n-1<<endl; sort(nod+1,nod+n,cmp); for(i=1;i<n;i++) { printf("%08d %d %d\n",nod[i].index,nod[i].g1,nod[i].g2); } } return 0; } /* 14 60 80 10000001 64 90 10000002 90 60 10000011 85 80 10000003 85 80 10000004 80 85 10000005 82 77 10000006 83 76 10000007 90 78 10000008 75 79 10000009 59 90 10000010 88 45 10000012 80 100 10000013 90 99 10000014 66 60 */
1063:
给一些集合,求任意两个集合的交集元素个数/并集元素个数。这里的元素里的元素有唯一性,一个元素在一个集合只存在一个。直接用set处理即可。
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<string> #include<set> #include<algorithm> const int maxn = 55; using namespace std; int n; set<int> mq[maxn]; set<int>::iterator it,it1,it2; int main() { int n,i; while(cin>>n) { for(i=1;i<=n;i++) mq[i].clear(); int k,x; for(i=1;i<=n;i++) { cin>>k; while(k--) { cin>>x; mq[i].insert(x); } } int q,a,b; cin>>q; while(q--) { cin>>a>>b; int len1=mq[a].size(); int len2=mq[b].size(); //把两个并起来方便一些,交集个数也就出来了-.- /*set<int> tmp; //这样会超时,因为需要新开一个set然后insert会耗时 for(it=mq[a].begin();it!=mq[a].end();it++) tmp.insert(*it); for(it=mq[b].begin();it!=mq[b].end();it++) tmp.insert(*it); int len3=tmp.size();*/ int len3=0; for(it1=mq[a].begin(),it2=mq[b].begin();it1!=mq[a].end()&&it2!=mq[b].end();) { if(*it1<*it2) it1++; else if(*it1>*it2) it2++; else {it1++,it2++;} len3++; } while(it1!=mq[a].end()) { it1++; len3++; } while(it2!=mq[b].end()) { it2++; len3++; } double ans1=len1+len2-len3; //交 double ans2=len3; //并 printf("%.1f%%\n",ans1*100.0/ans2); } } return 0; } /* 3 3 99 87 101 4 87 101 5 87 7 99 101 18 5 135 18 99 2 1 2 1 3 */
1064:
本题很看重思想,就是给你一些数,让你用这些数字构成完全二叉排序树。看了别人的博客才恍然大悟。由于是完全二叉树,那么如果父结点下标为i(从1开始计数)。存在左孩子,那么左孩子下标=2*i,如果存在右孩子,那么右孩子下标=2*i+1;并且有排序树的观点,那么用dfs即可,先从左子树标号,然后标记根,然后再标记右子树。(前提是先对所有的数字排个序)
代码:
#include<iostream> #include<cstdio> #include<cmath> #include<cstring> #include<string> #include<algorithm> const int maxn = 1005; using namespace std; int n; int a[maxn]; int ans[maxn]; int pos; int cmp(int p1,int p2) { if(p1<p2) return 1; return 0; } void dfs(int x) { if(x>n) return; int l,r; //分别代表左右孩子 l=x<<1,r=l+1; dfs(l); ans[x]=a[pos++]; dfs(r); } int main() { int i; while(cin>>n) { for(i=1;i<=n;i++) cin>>a[i]; sort(a+1,a+n+1,cmp); pos=1; dfs(1); cout<<ans[1]; for(i=2;i<=n;i++) cout<<" "<<ans[i]; cout<<endl; } return 0; } /* 10 1 2 3 4 5 6 7 8 9 0 */