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 }

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

你可能感兴趣的:(pat)