zoukankan      html  css  js  c++  java
  • 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
    ",v[j].rank,v[j].br);
    86                 break;
    87             }
    88             else if(t!=v[j].id&&j==n1-1)
    89                 printf("N/A
    ");
    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
    ");
    49         else{
    50             printf("%02d:%02d
    ",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,'',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
    ");
    42             else
    43                 printf("No
    ");
    44         }
    45         else
    46             printf("No
    ");
    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
    0");
    11         return 0;
    12     }
    13     //memset(c,'',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
    ");
    30     else
    31         printf("Yes
    ");
    32     for(i=l-1;i>=0;i--)
    33         printf(i==0?"%d
    ":"%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
    ":"%d ",v[i]);
    52     }
    53     return 0;
    54 }

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

  • 相关阅读:
    xen虚拟机管理命令
    ipmi
    http://classworlds.codehaus.org/apiusage.html
    maven编译问题之 -The POM for XXX is invalid, transitive dependencies (if any) will not be available
    SSM项目web.xml等配置文件中如何查找类的全路径名?
    shiro安全框架学习-1
    ht-8 对arrayList中的自定义对象排序( Collections.sort(List<T> list, Comparator<? super T> c))
    ht-7 treeSet特性
    ht-6 hashSet特性
    ht-5 treemap特性
  • 原文地址:https://www.cnblogs.com/hustfly/p/3532335.html
Copyright © 2011-2022 走看看