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 }

第一次接触树的题目,这是一个很经典的题目。包括了树的结构体的定义、树的生成、利用容器实现各种遍历、递归算法的实现。最关键的是遍历的转换,利用两个遍历还原整个二叉树(其中必须有一个是中序遍历)作为一个经典的题目,一定要利用这个题打开树类题目的思路。

posted @ 2014-01-24 17:26  塞北鸿雁飞  阅读(253)  评论(0编辑  收藏  举报