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 }
挺简单的一道题,感觉自己全队的,就是有组过不了,不知道为什么,应该是字符串转数字的问题吧。。
思路没什么问题,我的方法貌似还简单一些。。