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 ...
随机推荐
- Failed to execute goal.....webxml attribute is required...
maven在打包项目的时候报错 Failed to execute goal org.apache.maven.plugins:maven-war-plugin:2.2:war (default-wa ...
- vimrc示例
1 "=============================================================================== 2 " ...
- OpenGL图形管线和坐标变换[转]
1. OpenGL 渲染管线 OpenGL渲染管线分为两大部分,模型观测变换(ModelView Transformation)和投影变换(Projection Transformation).做个比 ...
- 转 命令行下玩VC
说明:(1)转载请注明出处:http://www.cnblogs.com/opangle/p/4298155.html (2)以下以VS2013为例,并假设VC安装路径为%VC_INSTALL_PAT ...
- What's New for Visual C# 6.0
https://msdn.microsoft.com/en-us/library/hh156499.aspx nameof You can get the unqualified string nam ...
- 将Ftp添加到资源管理器中直接使用
在资源管理器中,右键,添加网络位置. 然后输入ftp的url ftp://server2008 使用匿名方式登录
- openfire的配置
Openfire 采用Java开发,开源的实时协作(RTC)服务器基于XMPP(Jabber)协议.Openfire安装和使用都非常简单,并利用Web进行管理.单台服务器可支持上万并发用户.所以常常被 ...
- fiddler for mac
Fiddler 是一免费的web调试工具.并且兼容所有浏览器.系统和平台. Fiddler 是基于微软的 .Net 技术开发的,没办法直接在 Mac/Linux 下使用.本文介绍一些替代方案(这些方案 ...
- oracle判断一个字符串中是否包含另外一个字符串
select * from a where instr(a,b)>0; 用于实现B字段是A字段中的某一部分的时候,要论顺序或者要相邻的字符. 如果想要不论顺序或者不相邻的字符时,定义函数可以实现 ...
- Android自动化测试之Monkeyrunner从零开始(三)
转自http://www.51testing.com/html/81/22381-854342.html 时光过得太快了,一晃离上一篇monkeyrunner系列的博客已经一年多了.这一年多时间经历了 ...