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\n",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,'\0',sizeof(t));
31     for(i=0;i<strlen(query);i++)
32         t[i]=query[i+3];
33     printf("%s\n",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\n",v[i].id);
50 
51     }
52     if(flag==0&&r>=n)
53         printf("Not Found\n");
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()=='\n')
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,'\0',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,'\0',sizeof(a));
12     memset(b,'\0',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\n%s\n",b);
34     else{
35         printf("Yes\n%s\n",b);
36     }
37 }

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

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

posted @ 2014-02-27 00:41  塞北鸿雁飞  阅读(226)  评论(0编辑  收藏  举报