做起来还是不是特别顺手。。。
题目地址:http://pat.zju.edu.cn/contests/pat-a-practise
1001:
题目大意:就是个A+B,不过需要控制输出格式,注意一下就可以了,多写点测试数据。
AC代码:
<span style="font-size:18px;">//water</span> #include<iostream> #include<cstdio> #include<cmath> using namespace std; int s[10]; int ss[10]; int main() { int a,b,i; while(cin>>a>>b) { int t=0; int c=a+b; int flag=0; if(c==0) { puts("0"); continue; } if(c<0) { flag=1; c=-c; } while(c) { s[t++]=c%1000; c/=1000; } for(i=0;i<t;i++) ss[i]=s[t-1-i]; if(flag) { printf("-"); } printf("%d",ss[0]); for(i=1;i<t;i++) { printf(",%03d",ss[i]); } printf("\n"); } return 0; } /* 123 321 999 -999 999 1 */
1002:
题目大意:给你两个多项式,然后相加即可,如果多项式的系数是0,就不输出。。
AC代码:
//water //#include "stdafx.h" #include<cstring> #include<iostream> #include<cstdio> #include<cmath> using namespace std; const int maxn=2000005; double a[maxn]; int main() { int k,i,p; double x; while(cin>>k) { memset(a,0,sizeof(a)); for(i=0;i<k;i++) { cin>>p>>x; a[p]+=x; } cin>>k; for(i=0;i<k;i++) { cin>>p>>x; a[p]+=x; } int sum=0; for(i=0;i<=maxn-1;i++) { if(fabs(a[i])>=0.1) sum++; } cout<<sum; for(i=maxn-1;i>=0;i--) { if(fabs(a[i])>=0.1) printf(" %d %.1f",i,a[i]); } cout<<endl; } return 0; } /* 2 1 2.4 0 3.2 2 2 1.5 1 0.5 2 1 -2.4 0 -3.2 2 2 -1.5 1 -0.5 2 1 -2.4 0 0.5 2 2 -1.5 1 2.4 */
1003:
题目大意:给你n个节点,每个节点有自己的权值,m条路,每条路有自己的长度,问你从起点c1到终点c2的最短路有多少条,并且在这些最短路中找一条使得这条路沿行的点的权值加起来最大。
解题思路:带回溯的dfs,其实开始不敢写,因为有500层,抱着试一试的心态还是果断地写了。
AC代码:
//带回溯的dfs,不是500层么。。 #include<cstring> #include<iostream> #include<cstdio> #include<cmath> using namespace std; const int maxn=502; int wei[maxn]; int visi[maxn]; int mp[maxn][maxn]; int len,cnt,peo; //最短路长度,最短路个数,最大人数 int n,c2; void dfs(int from,int ct,int l) { if(len!=-1&&l>len) return; if(from==c2) { if(len==-1||l<len) { len=l; cnt=1; peo=ct; } else if(l==len) { cnt++; if(ct>peo) peo=ct; } return; } for(int i=0;i<n;i++) { if(!visi[i]&&mp[from][i]!=-1) { visi[i]=1; dfs(i,ct+wei[i],l+mp[from][i]); visi[i]=0; } } } int main() { int m,c1; int i; while(cin>>n>>m>>c1>>c2) { for(i=0;i<n;i++) cin>>wei[i]; memset(mp,-1,sizeof(mp)); memset(visi,0,sizeof(visi)); int x,y,val; for(i=0;i<m;i++) { cin>>x>>y>>val; mp[x][y]=val; mp[y][x]=val; } len=-1,cnt=0,peo=0; visi[c1]=1; dfs(c1,wei[c1],0); //从哪个点,人数,长度 cout<<cnt<<" "<<peo<<endl; } return 0; } /* 5 6 0 2 1 2 1 5 3 0 1 1 0 2 2 0 3 1 1 2 1 2 4 1 3 4 1 */
1004:
题目大意:给你一颗树,1是根,从根遍历,然后输出每一层的叶子节点的个数。
解题思路:直接dfs,但是有一个坑点,如果某一层没有节点了,那么不再输出。。这个也比较容易理解,因为不再是针对这颗树了,比如这颗树只有7层,我们却输出了10层。。
AC代码:
//有一个坑点:当前层没有节点的话就不输出。。 #include<cstring> #include<iostream> #include<cstdio> #include<cmath> #include<vector> using namespace std; vector <int> mq[105]; int ans[105]; int n,m; void dfs(int cur,int lv) { if(ans[lv]==-1) ans[lv]=0; int i; if(mq[cur].size()==0) ans[lv]++; for(i=0;i<mq[cur].size();i++) { int nex=mq[cur][i]; if(lv+1<=n) dfs(nex,lv+1); } } int main() { int i,j; while(cin>>n>>m) { for(i=1;i<=n;i++) mq[i].clear(); int root,num,x; for(i=0;i<m;i++) { cin>>root>>num; for(j=0;j<num;j++) { cin>>x; mq[root].push_back(x); } } memset(ans,-1,sizeof(ans)); //记录从root下来每一层有多少叶子 dfs(1,1); for(i=1;i<=n;i++) { if(ans[i]!=-1) { if(i>1) cout<<" "; cout<<ans[i]; } else break; } } return 0; } /* 2 1 01 1 02 */