A题进行时--浙大PAT 1011-1020
1011
1 #include<stdio.h> 2 #include<string.h> 3 4 int main(){ 5 float w[4]; 6 float t[4]; 7 float l[4]; 8 char a[4]; 9 float x[4]; 10 int i; 11 float sum; 12 memset(w,0,sizeof(w)); 13 memset(t,0,sizeof(w)); 14 memset(l,0,sizeof(w)); 15 16 for(i=0;i<3;i++){ 17 scanf("%f %f %f",&w[i],&t[i],&l[i]); 18 } 19 20 for(i=0;i<3;i++){ 21 //x[i]=max(w[i],t[i],l[i]); 22 if(w[i]>t[i]&&w[i]>l[i]){ 23 x[i]=w[i]; 24 a[i]='W'; 25 } 26 else if(t[i]>l[i]){ 27 x[i]=t[i]; 28 a[i]='T'; 29 } 30 else{ 31 x[i]=l[i]; 32 a[i]='L'; 33 } 34 } 35 sum=(x[0]*x[1]*x[2]*0.65-1)*2; 36 printf("%c %c %c %.2f",a[0],a[1],a[2],sum); 37 return 0; 38 }
也是非常简单的一道题,没什么好说的
1012(重要!!)
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<vector> 5 using namespace std; 6 struct stu{ 7 int id; 8 int c; 9 int m; 10 int e; 11 int a; 12 char br; 13 int rank; 14 }; 15 bool cmpbyA(stu A,stu B){ 16 return A.a>B.a; 17 } 18 bool cmpbyC(stu A,stu B){ 19 return A.c>B.c; 20 } 21 bool cmpbyM(stu A,stu B){ 22 return A.m>B.m; 23 } 24 bool cmpbyE(stu A,stu B){ 25 return A.e>B.e; 26 } 27 int main(){ 28 int i,j; 29 int n1,n2; 30 int t; 31 int score,r; 32 vector<stu> v; 33 freopen("in2.txt","r",stdin); 34 scanf("%d %d",&n1,&n2); 35 for(i=0;i<n1;i++){ 36 stu s; 37 scanf("%d %d %d %d",&(s.id),&(s.c),&(s.m),&(s.e)); 38 s.a=(s.c+s.m+s.e)/3; 39 v.push_back(s); 40 } 41 score=-1; 42 r=0; 43 sort(v.begin(),v.end(),cmpbyA); 44 for(i=0;i<v.size();i++){ 45 if(v[i].a!=score) 46 r=i+1; 47 score=v[i].a; 48 v[i].rank=r; 49 v[i].br='A'; 50 } 51 sort(v.begin(),v.end(),cmpbyC); 52 for(i=0;i<v.size();i++){ 53 if(v[i].c!=score) 54 r=i+1; 55 score=v[i].c; 56 if(v[i].rank>r){ 57 v[i].rank=r; 58 v[i].br='C'; 59 } 60 } 61 sort(v.begin(),v.end(),cmpbyM); 62 for(i=0;i<v.size();i++){ 63 if(v[i].m!=score) 64 r=i+1; 65 score=v[i].m; 66 if(v[i].rank>r){ 67 v[i].rank=r; 68 v[i].br='M'; 69 } 70 } 71 sort(v.begin(),v.end(),cmpbyE); 72 for(i=0;i<v.size();i++){ 73 if(v[i].e!=score) 74 r=i+1; 75 score=v[i].e; 76 if(v[i].rank>r){ 77 v[i].rank=r; 78 v[i].br='E'; 79 } 80 } 81 for(i=0;i<n2;i++){ 82 scanf("%d",&t); 83 for(j=0;j<n1;j++){ 84 if(t==v[j].id){ 85 printf("%d %c\n",v[j].rank,v[j].br); 86 break; 87 } 88 else if(t!=v[j].id&&j==n1-1) 89 printf("N/A\n"); 90 } 91 } 92 return 0; 93 }
教科书一般的代码,从这个代码可以学到很多:
c++中vector容器的应用,使用此容器,直接将结构体装入容器内,直接利用vector本身的函数就可以非常方便的进行排序、计算大小等。
注意排名时候的名词并列的情况,本程序提供了一个非常优秀的处理方案,一定要学会使用。
1014
1 #include<stdio.h> 2 #include<string.h> 3 #include<vector> 4 #include<algorithm> 5 using namespace std; 6 7 vector<int> v[25]; 8 int t[1005]; 9 int cend[1005]; 10 int n,m,k,q; 11 int main(){ 12 int i,j; 13 int s,f; 14 freopen("in.txt","r",stdin); 15 memset(t,0,sizeof(t)); 16 memset(cend,0,sizeof(cend)); 17 for(i=0;i<25;i++){ 18 v[i].clear(); 19 } 20 scanf("%d%d%d%d",&n,&m,&k,&q); 21 for(i=1;i<=k;i++){ 22 scanf("%d",&t[i]); 23 } 24 j=0; 25 for(i=1;i<=n*m;i++){ 26 v[j].push_back(i); 27 if(i<=n) cend[i]=t[i]; 28 else cend[i]=cend[i-n]+t[i]; 29 if(j!=n-1) j++; 30 else j=0; 31 } 32 33 for(i=n*m+1;i<=k;i++){ 34 int min=123123123; 35 for(j=0;j<n;j++){ 36 if(cend[v[j].front()]<min){ 37 min=cend[v[j].front()]; 38 s=j; 39 } 40 } 41 cend[i]=cend[v[s].back()]+t[i]; 42 43 v[s].erase(v[s].begin()); 44 v[s].push_back(i); 45 } 46 for(i=0;i<q;i++){ 47 scanf("%d",&f); 48 if((cend[f]-t[f])>9*60) printf("Sorry\n"); 49 else{ 50 printf("%02d:%02d\n",cend[f]/60+8,cend[f]%60); 51 } 52 } 53 return 0; 54 }
利用上次学会的vector容器可以非常方便的解决这个问题。本质就是一个队列问题。
刚开始还是没有思路,虽然知道是个队列但是无法下手,后来参考大神的代码明白了要将整个队伍分成两部分考虑,一部分是黄线内的,他们的时间可以直接根据队伍确定,另一部分是黄线外,就必须要通过队列的出入时间来确定。理清这个思路,代码就其实比较容易实现。
提交的时候遇到了几个问题,一个是我的变量命名,不要和vector方法重名,比如说end,以后代码中要注意;另一个是这道题的一个细节,之前没有把题意弄清,一定要注意最后的判断条件,本题容易出错的地方:是在17:00及以后开始服务的客户输出"Sorry",而不是17:00之前结束服务的输出"Sorry";
如客户cId是16:59开始服务,服务时间为2,则输出的应该是17:01,而不是"Sorry"。这些都查好改过以后,就AC了。
1015
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 bool isp(int x) 5 { 6 if(x<2) 7 return false; 8 if(x==2||x==3) 9 return true; 10 for(int i=2;i*i<=x;i++) 11 { 12 if(x%i==0) 13 return false; 14 } 15 return true; 16 } 17 int main(){ 18 int n,d; 19 char r[15]; 20 int i,k,sum; 21 freopen("in.txt","r",stdin); 22 while(scanf("%d",&n)!=EOF){ 23 if(n<0) 24 break; 25 scanf("%d",&d); 26 if(isp(n)){ 27 memset(r,'\0',sizeof(r)); 28 i=0; 29 sum=0; 30 while(n!=0){ 31 r[i]=n%d+'0'; 32 n=n/d; 33 i++; 34 } 35 k=1; 36 for(i=strlen(r)-1;i>=0;i--){ 37 sum+=(r[i]-'0')*k; 38 k*=d; 39 } 40 if(isp(sum)) 41 printf("Yes\n"); 42 else 43 printf("No\n"); 44 } 45 else 46 printf("No\n"); 47 48 } 49 return 0; 50 }
还算是自己有思路的一道题,基本不用任何参考自己做了出来,就是有点小问题,一定要注意到原来的数字也要是质数!
还有对于质数的判断,这道题的方法就作为参考,以后的质数都这样来判断。
我自己的方法是将每一位都转化为为字符串来处理,还算是比较简单。
还有一种比较好的(高端)方法是利用队列,关键代码如下:
1 if(isPrime(n)) 2 { 3 queue<int>q; 4 while(n!=0) 5 { 6 q.push(n%d); 7 n=n/d; 8 } 9 int reverse=0; 10 while(!q.empty()) 11 { 12 reverse=reverse*d; 13 reverse=reverse+q.front(); 14 q.pop(); 15 } 16 if(isPrime(reverse)) 17 { 18 cout<<"Yes"<<endl; 19 } 20 else 21 { 22 cout<<"No"<<endl; 23 }
其实吧。。思路都一样
1019
1 #include<stdio.h> 2 #include<string.h> 3 4 int main(){ 5 int n,b; 6 int i,j; 7 int c[50]; 8 scanf("%d %d",&n,&b); 9 if(n==0){ 10 printf("Yes\n0"); 11 return 0; 12 } 13 //memset(c,'\0',sizeof(c)); 14 i=0; 15 while(n!=0){ 16 c[i]=n%b; 17 n=n/b; 18 i++; 19 } 20 int l=i; 21 int flag=1; 22 for(i=0,j=l-1;i<j;i++,j--){ 23 if(c[i]!=c[j]){ 24 flag=0; 25 break; 26 } 27 } 28 if(flag==0) 29 printf("No\n"); 30 else 31 printf("Yes\n"); 32 for(i=l-1;i>=0;i--) 33 printf(i==0?"%d\n":"%d ",c[i]); 34 35 return 0; 36 }
其实是一道很简单的题,关键就是十进制的转换。转换之后的储存。利用最简单的int数组就可以了,完全不需要其他容器或是我自己用的char数组的辅助就可以解决。希望给自己一个启示,以后不要把这种题目给复杂化了。
还有一点是这种对称的题的判断,从两头一起移动判断最合适,结束条件为i<j即可。
1020
1 #include<stdio.h> 2 #include<string.h> 3 #include<queue> 4 #include<vector> 5 #include<algorithm> 6 using namespace std; 7 struct node{ 8 int n; 9 node *left; 10 node *right; 11 }; 12 queue<node *> q; 13 vector<int> v; 14 node* buildtree(int *a,int *b,int n){ 15 if(n<=0) return NULL; 16 node *root=(node *)malloc(sizeof(node)); 17 root->left=NULL; 18 root->right=NULL; 19 root->n=a[n-1]; 20 int i=0; 21 for(i=0;i<n;i++){ 22 if(b[i]==a[n-1]) 23 break; 24 } 25 root->left=buildtree(a,b,i); 26 root->right=buildtree(a+i,b+i+1,n-i-1); 27 return root; 28 } 29 void levelorder(node *tree){ 30 if(tree!=NULL) q.push(tree); 31 while(!q.empty()){ 32 node *t=q.front(); 33 if(t->left!=NULL) q.push(t->left); 34 if(t->right!=NULL) q.push(t->right); 35 v.push_back(t->n); 36 q.pop(); 37 } 38 } 39 int main(){ 40 int a[32],b[32]; 41 int i,n; 42 freopen("in.txt","r",stdin); 43 scanf("%d",&n); 44 for(i=0;i<n;i++) 45 scanf("%d",&a[i]); 46 for(i=0;i<n;i++) 47 scanf("%d",&b[i]); 48 node *tree=buildtree(a,b,n); 49 levelorder(tree); 50 for(i=0;i<n;i++){ 51 printf(i==n-1?"%d\n":"%d ",v[i]); 52 } 53 return 0; 54 }
第一次接触树的题目,这是一个很经典的题目。包括了树的结构体的定义、树的生成、利用容器实现各种遍历、递归算法的实现。最关键的是遍历的转换,利用两个遍历还原整个二叉树(其中必须有一个是中序遍历)作为一个经典的题目,一定要利用这个题打开树类题目的思路。