A题进行时--浙大PAT 1021-1030
1021:
#include<stdio.h>
#include<string.h>
#include<vector>
#include<queue>
using namespace std; #define N 10005
vector<int> v[N];
queue<int> q;
int tree[N],h[N],dis[N],vis[N];
int n,maxh; int findroot(int x){
if(tree[x]==-)
return x;
else{
int tmp=findroot(tree[x]);
tree[x]=tmp;
return tmp;
}
}
void merge(int x,int y){
x=findroot(x);
y=findroot(y);
if(x!=y){
tree[x]=y;
}
}
int bfs(int p){
int height=;;
int i,j,k;
while(!q.empty())
q.pop();
memset(dis,,sizeof(dis));
memset(vis,,sizeof(vis));
q.push(p);
vis[p]=;
while(!q.empty()){
k=q.front();
q.pop();
for(i=;i<v[k].size();i++){
if(!vis[v[k][i]]){
dis[v[k][i]]=dis[k]+;
if(height<dis[v[k][i]]) height=dis[v[k][i]];
q.push(v[k][i]);
vis[v[k][i]]=;
}
}
}
if(maxh<height)
maxh=height;
return height; }
int main(){
freopen("in2.txt","r",stdin);
int x,y;
int i,j;
scanf("%d",&n);
for(i=;i<N;i++)
tree[i]=-;
for(i=;i<n;i++){
scanf("%d %d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
merge(x,y);
}
int cnt=;
maxh=;
for(i=;i<=n;i++){
if(tree[i]==-)
cnt++;
}
if(cnt==){
for(i=;i<=n;i++){
h[i]=bfs(i);
}
for(i=;i<=n;i++){
if(h[i]==maxh)
printf("%d\n",i);
} }
else
printf("Error: %d components",cnt); return ;
}
对我来说挑战非常大的一道题,看了很多资料,看了很多方法,找到一个适合自己的代码,一直研究才弄的差不多。。
首先是利用并查集来判断连通分量的个数,这是一个很经典也很方便的方法,希望以后自己能多利用。非常好用,思路也不难。就是利用双亲表示法来表示树,把相关的合并在一起,然后递归找双亲节点,都是固定的东西。
然后就是bfs的东西,这个一直没接触过,第一次还是有很大的压力。各种各样的问题。希望以后再有深刻理解。其实思路并不难,关键是注意细节。
1022:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
#define N 10005
struct book{
char id[];
char title[];
char author[];
char key[];
vector<string> keys;
char publish[];
char year[];
};
vector<book> v;
int n,m;
bool cmp(book a,book b){
if(strcmp(a.id,b.id)<)
return true;
else
return false;
}
void search(char *query){
int i,j;
char t[];
int r=,flag=;
memset(t,'\0',sizeof(t));
for(i=;i<strlen(query);i++)
t[i]=query[i+];
printf("%s\n",query);
for(i=;i<n;i++){
flag=;
switch(query[]){
case '': strcmp(t,v[i].title)==?flag=:r++; break;
case '': strcmp(t,v[i].author)==?flag=:r++; break;
case '': strcmp(t,v[i].publish)==?flag=:r++; break;
case '': strcmp(t,v[i].year)==?flag=:r++; break;
case '': {
for(j=;j<v[i].keys.size();j++){
t==v[i].keys[j]?flag=:r++;
}break;
}
} if(flag!=)
printf("%s\n",v[i].id); }
if(flag==&&r>=n)
printf("Not Found\n");
}
int main(){
freopen("in.txt","r",stdin);
int i=,j=,k=;
char temp[];
scanf("%d",&n);
getchar();
for(i=;i<n;i++){
struct book b;
gets(b.id);
gets(b.title);
gets(b.author);
while(cin>>temp){
b.keys.push_back(temp);
if(cin.get()=='\n')
break;
}
gets(b.publish);
gets(b.year);
v.push_back(b);
}
sort(v.begin(),v.end(),cmp); scanf("%d",&m);
getchar();
for(i=;i<m;i++){
char query[];
memset(query,'\0',sizeof(query));
gets(query);
search(query);
}
return ;
}
感觉有点伤到了。。本来不是复杂的问题,全都是关于输入的问题,然后是相同的项查找问题。。
c语言的输入字符串处理实在是能力有限,感觉受不了了。。排序也没有记清楚,这个记住吧。。然后是后来的相同项处理显得笨拙,还是别人的代码写的好一些。。
1023:
#include<stdio.h>
#include<string.h>
int x[];
int y[];
int main(){
long long n,m;
int i,j,t;
char a[],b[];
memset(x,,sizeof(y));
memset(y,,sizeof(y));
memset(a,'\0',sizeof(a));
memset(b,'\0',sizeof(b));
scanf("%s",a);
sscanf(a,"%lld",&n);
for(i=;i<strlen(a);i++){
t=a[i]-'';
x[t]++;
}
m=n*;
sprintf(b,"%lld",m);
for(i=;i<strlen(b);i++){
t=b[i]-'';
y[t]++;
}
int equal=;
for(i=;i<;i++){
if(x[i]!=y[i]){
equal=;
break;
}
}
if(equal==)
printf("No\n%s\n",b);
else{
printf("Yes\n%s\n",b);
}
}
挺简单的一道题,感觉自己全队的,就是有组过不了,不知道为什么,应该是字符串转数字的问题吧。。
思路没什么问题,我的方法貌似还简单一些。。
A题进行时--浙大PAT 1021-1030的更多相关文章
- A题进行时--浙大PAT 1001-1010
pat链接:http://pat.zju.edu.cn 1 #include<stdio.h> 2 int main(){ 3 int a,b; 4 int c; 5 while(scan ...
- A题进行时--浙大PAT 1011-1020
#include<stdio.h> #include<string.h> int main(){ ]; ]; ]; ]; ]; int i; float sum; memset ...
- 浙大PAT CCCC L3-013 非常弹的球 ( 高中物理题 )
题目链接 题意 : 刚上高一的森森为了学好物理,买了一个“非常弹”的球.虽然说是非常弹的球,其实也就是一般的弹力球而已.森森玩了一会儿弹力球后突然想到,假如他在地上用力弹球,球最远能弹到多远去呢?他不 ...
- 浙大 PAT 乙级 1001-1075 目录索引
1001. 害死人不偿命的(3n+1)猜想 1002. 写出这个数 1003. 我要通过! 1004. 成绩排名 1005. 继续(3n+1)猜想 1006. 换个格式输出整数 1007. 素数对猜想 ...
- PAT 乙级1030 完美数列(25) C++版
1030. 完美数列(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定一个正整数数列,和正整数p,设这 ...
- PAT乙级 1030. 完美数列(25)
1030. 完美数列(25) 时间限制 300 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CAO, Peng 给定一个正整数数列,和正整数p,设这 ...
- PAT 1021
1021. Deepest Root (25) A graph which is connected and acyclic can be considered a tree. The height ...
- 浙大 pat 1047题解
1047. Student List for Course (25) 时间限制 400 ms 内存限制 64000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...
- 浙大pat 1037
1037. Magic Coupon (25) 时间限制 100 ms 内存限制 32000 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue The magi ...
随机推荐
- C#基础精华----枚举
enums枚举是值类型,数据直接存储在栈中,而不是使用引用和真实数据的隔离方式来存储. (1)默认情况下,枚举中的第一个变量被赋值为0,其他的变量的值按定义的顺序来递增(0,12,3...),因此以下 ...
- MVC5中Model层开发数据注解
ASP.NET MVC5中Model层开发,使用的数据注解有三个作用: 数据映射(把Model层的类用EntityFramework映射成对应的表) 数据验证(在服务器端和客户端验证数据的有效性) 数 ...
- 78. Subsets
题目: Given a set of distinct integers, S, return all possible subsets. Note: Elements in a subset mus ...
- 关于java -version版本问题
因为安装了Oracle,而Oracel会自带JDK,安装完成后,会自动把自己的JDK设置在最前面(path变量里). 这就是为什么结果与事实不相同的原因. 解决方法: 进入系统环境变量,找到path变 ...
- BIND9配置文件详解模板[转载]
在CU上看到了一篇关于BIND9配置文件详解的文章,感觉不错,现转载了分享一下. //named.conf 注释说明 by shellyxz@163.com// 此文件对bind9的默认配置文件的说明 ...
- (3)TXT转为XML
<?xml version="1.0" encoding="utf-8"?> <bocb2e> <head /> <t ...
- *像word一样编辑复杂的文本:SpannableString 样式详介
简介: 使用android.text.Spanned; android.text.SpannableString; android.text.SpannableStringBuilder; 和 and ...
- 利用Java自带的MD5加密java.security.MessageDigest;
MD5加密算法,即"Message-Digest Algorithm 5(信息-摘要算法)",它由MD2.MD3.MD4发展而来的一种单向函数算法(也就是HASH算法),它是国际著 ...
- 1346. Intervals of Monotonicity(dp)
1346 简单dp #include <iostream> #include<cstdio> #include<cstring> #include<algor ...
- poj 1185 炮兵阵地(三维状态压缩dP)
题目:http://poj.org/problem?id=1185 思路: d[i][j][k]表示第i行的状态为第k个状态,第i-1行的状态为第j个状态的时候 的炮的数量. 1表示放大炮, 地形状态 ...