zoukankan      html  css  js  c++  java
  • A题进行时--浙大PAT 1021-1030

    1021:

     1 #include<stdio.h>
     2 #include<string.h>
     3 #include<vector>
     4 #include<queue>
     5 using namespace std;
     6 
     7 #define N 10005
     8 vector<int> v[N];
     9 queue<int> q;
    10 int tree[N],h[N],dis[N],vis[N];
    11 int n,maxh;
    12 
    13 int findroot(int x){
    14     if(tree[x]==-1)
    15         return x;
    16     else{
    17         int tmp=findroot(tree[x]);
    18         tree[x]=tmp;
    19         return tmp;
    20     }
    21 }
    22 void merge(int x,int y){
    23     x=findroot(x);
    24     y=findroot(y);
    25     if(x!=y){
    26         tree[x]=y;
    27     }
    28 }
    29 int bfs(int p){
    30     int height=0;;
    31     int i,j,k;
    32     while(!q.empty())
    33         q.pop();
    34     memset(dis,0,sizeof(dis));
    35     memset(vis,0,sizeof(vis));
    36     q.push(p);
    37     vis[p]=1;
    38     while(!q.empty()){
    39         k=q.front();
    40         q.pop();
    41         for(i=0;i<v[k].size();i++){
    42             if(!vis[v[k][i]]){
    43                 dis[v[k][i]]=dis[k]+1;
    44                 if(height<dis[v[k][i]])  height=dis[v[k][i]];
    45                 q.push(v[k][i]);
    46                 vis[v[k][i]]=1;
    47             }
    48         }
    49     }
    50     if(maxh<height)
    51             maxh=height;
    52     return height;
    53 
    54 }
    55 int main(){
    56     freopen("in2.txt","r",stdin);
    57     int x,y;
    58     int i,j;
    59     scanf("%d",&n);
    60     for(i=0;i<N;i++)
    61         tree[i]=-1;
    62     for(i=0;i<n;i++){
    63         scanf("%d %d",&x,&y);
    64         v[x].push_back(y);
    65         v[y].push_back(x);
    66         merge(x,y);
    67     }
    68     int cnt=0;
    69     maxh=0;
    70     for(i=1;i<=n;i++){
    71         if(tree[i]==-1)
    72             cnt++;
    73     }
    74     if(cnt==1){
    75         for(i=1;i<=n;i++){
    76             h[i]=bfs(i);
    77         }
    78         for(i=1;i<=n;i++){
    79             if(h[i]==maxh)
    80                 printf("%d
    ",i);
    81         }
    82 
    83     }
    84     else
    85         printf("Error: %d components",cnt);
    86 
    87     return 0;
    88 }

    对我来说挑战非常大的一道题,看了很多资料,看了很多方法,找到一个适合自己的代码,一直研究才弄的差不多。。

    首先是利用并查集来判断连通分量的个数,这是一个很经典也很方便的方法,希望以后自己能多利用。非常好用,思路也不难。就是利用双亲表示法来表示树,把相关的合并在一起,然后递归找双亲节点,都是固定的东西。

    然后就是bfs的东西,这个一直没接触过,第一次还是有很大的压力。各种各样的问题。希望以后再有深刻理解。其实思路并不难,关键是注意细节。

    1022:

     1 #include<stdio.h>
     2 #include<iostream>
     3 #include<string.h>
     4 #include<vector>
     5 #include<algorithm>
     6 #include<string>
     7 using namespace std;
     8 #define N 10005
     9 struct book{
    10     char id[8];
    11     char title[80];
    12     char author[80];
    13     char key[80];
    14     vector<string> keys;
    15     char publish[80];
    16     char year[5];
    17 };
    18 vector<book> v;
    19 int n,m;
    20 bool cmp(book a,book b){
    21     if(strcmp(a.id,b.id)<0)
    22         return true;
    23     else
    24         return false;
    25 }
    26 void search(char *query){
    27     int i,j;
    28     char t[40];
    29     int r=0,flag=0;
    30     memset(t,'',sizeof(t));
    31     for(i=0;i<strlen(query);i++)
    32         t[i]=query[i+3];
    33     printf("%s
    ",query);
    34     for(i=0;i<n;i++){
    35         flag=0;
    36         switch(query[0]){
    37         case '1': strcmp(t,v[i].title)==0?flag=1:r++; break;
    38         case '2': strcmp(t,v[i].author)==0?flag=1:r++; break;
    39         case '4': strcmp(t,v[i].publish)==0?flag=1:r++; break;
    40         case '5': strcmp(t,v[i].year)==0?flag=1:r++; break;
    41         case '3': {
    42             for(j=0;j<v[i].keys.size();j++){
    43                 t==v[i].keys[j]?flag=1:r++;
    44             }break;
    45         }
    46         }
    47 
    48         if(flag!=0)
    49             printf("%s
    ",v[i].id);
    50 
    51     }
    52     if(flag==0&&r>=n)
    53         printf("Not Found
    ");
    54 }
    55 int main(){
    56     freopen("in.txt","r",stdin);
    57     int i=0,j=0,k=0;
    58     char temp[20];
    59     scanf("%d",&n);
    60     getchar();
    61     for(i=0;i<n;i++){
    62         struct book b;
    63         gets(b.id);
    64         gets(b.title);
    65         gets(b.author);
    66         while(cin>>temp){
    67             b.keys.push_back(temp);
    68             if(cin.get()=='
    ')
    69                 break;
    70         }
    71         gets(b.publish);
    72         gets(b.year);
    73         v.push_back(b);
    74     }
    75     sort(v.begin(),v.end(),cmp);
    76 
    77     scanf("%d",&m);
    78     getchar();
    79     for(i=0;i<m;i++){
    80         char query[40];
    81         memset(query,'',sizeof(query));
    82         gets(query);
    83         search(query);
    84     }
    85     return 0;
    86 }

    感觉有点伤到了。。本来不是复杂的问题,全都是关于输入的问题,然后是相同的项查找问题。。

    c语言的输入字符串处理实在是能力有限,感觉受不了了。。排序也没有记清楚,这个记住吧。。然后是后来的相同项处理显得笨拙,还是别人的代码写的好一些。。

    1023:

     1 #include<stdio.h>
     2 #include<string.h>
     3 int x[10];
     4 int y[10];
     5 int main(){
     6     long long n,m;
     7     int i,j,t;
     8     char a[20],b[20];
     9     memset(x,0,sizeof(y));
    10     memset(y,0,sizeof(y));
    11     memset(a,'',sizeof(a));
    12     memset(b,'',sizeof(b));
    13     scanf("%s",a);
    14     sscanf(a,"%lld",&n);
    15     for(i=0;i<strlen(a);i++){
    16         t=a[i]-'0';
    17         x[t]++;
    18     }
    19     m=n*2;
    20     sprintf(b,"%lld",m);
    21     for(i=0;i<strlen(b);i++){
    22         t=b[i]-'0';
    23         y[t]++;
    24     }
    25     int equal=1;
    26     for(i=0;i<10;i++){
    27         if(x[i]!=y[i]){
    28             equal=0;
    29             break;
    30         }
    31     }
    32     if(equal==0)
    33         printf("No
    %s
    ",b);
    34     else{
    35         printf("Yes
    %s
    ",b);
    36     }
    37 }

    挺简单的一道题,感觉自己全队的,就是有组过不了,不知道为什么,应该是字符串转数字的问题吧。。

    思路没什么问题,我的方法貌似还简单一些。。

  • 相关阅读:
    adb入门学习笔记
    adb连接手机模拟器
    burp抓取手机模拟器流量
    Windows 下安装drozer(Windows 10),连接手机(红米note4X)
    UnicodeEncodeError: 'ascii' codec can't encode characters in position
    Windows下的Nessus安装与启动
    对VAuditDemo的一次审计
    http协议
    namp详解
    sqlmap详解
  • 原文地址:https://www.cnblogs.com/hustfly/p/3570529.html
Copyright © 2011-2022 走看看