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 }

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

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

你可能感兴趣的:(pat)