2017.12.9考试
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2017.12.9考试相关的知识,希望对你有一定的参考价值。
又到了信息课,又开始了考试。
那么我们先来看看今天的题目:
试题
T1
Source
像我这样特立独行的人,自然不会用一般的方法(我不会。。。)
那么我们来看建树的方法,思想和大众方法一致
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> typedef struct node{ char data; node *l,*r; }*tree; tree t; char a[26],b[26]; int i,n; int pos(int l,int r,char c){ for(int j=l;j<=r;j++) if(b[j]==c)return j; return -1; } void build(tree &bt,int l,int r){ if(l>r)return; i++; int p=pos(l,r,a[i]); if(p==-1)return; bt=new node; bt->l=bt->r=NULL; bt->data=a[i]; build(bt->l,l,p-1); build(bt->r,p+1,r); } void houxu(tree bt){ if(bt!=NULL){ houxu(bt->l); houxu(bt->r); printf("%c",bt->data); } } int main(){ freopen("binary.in","r",stdin); freopen("binary.out","w",stdout); int j,k,m; scanf("%s%s",a,b); n=strlen(a); i=-1; build(t,0,n-1); houxu(t); puts(""); return 0; } //by:GG
T2
Source
这是公认的一道难题,我们来看,对于每一个点,他有且仅有可能插入到一条边上的点里面,对吧。。。
然后就一顿乱推,程序就码完了。
//16:00之前做完今天的题! #include<bits/stdc++.h> using namespace std; int a[5010][5010]; int main(){ freopen("weight.in","r",stdin); freopen("weight.out","w",stdout); int i,j,k,n,m; while(scanf("%d",&n)==1 && n){ for(i=1;i<n;i++) for(j=i+1;j<=n;j++){ scanf("%d",&a[i][j]); a[j][i]=a[i][j]; } int ans=a[1][2]; for(i=3;i<=n;i++){ int t=2147483647; for(j=2;j<i;j++) t=min(t,(a[1][i]+a[j][i]-a[1][j])/2); ans+=t; } printf("%d\\n",ans); } return 0; }
T3
Source
最小生成树裸题,不解释吧。
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<math.h> #include<algorithm> int x[110],y[110]; struct line{ int u,v; double d; }e[100010]; int f[110]; int find(int x){ if(f[x]!=x)f[x]=find(f[x]); return f[x]; } void join(int x,int y){ x=find(x);y=find(y); if(x!=y)f[y]=x; } int cmp(line a,line b){ return a.d<b.d; } double calc(int i,int j){ return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); } int main(){ freopen("bridge.in","r",stdin); freopen("bridge.out","w",stdout); int i,j,n,m,cnt=0; scanf("%d",&n); for(i=1;i<=n;i++)f[i]=i; for(i=1;i<=n;i++) scanf("%d%d",&x[i],&y[i]) ; for(i=1;i<=n;i++) for(j=i+1;j<=n;j++){ e[++cnt].u=i;e[cnt].v=j; e[cnt].d=calc(i,j); e[++cnt].u=j;e[cnt].v=i; e[cnt].d=calc(i,j); } std::sort(e+1,e+cnt+1,cmp); double ans=0; int k=0; for(i=1;i<=cnt;i++){ int u=e[i].u,v=e[i].v; u=find(u);v=find(v); if(u!=v){ join(u,v); k++;ans+=e[i].d; if(k==n-1)break; } } printf("%.3lf\\n",ans); return 0; }
T4
Source
先判断有没有环,因为如果有环,必然就可以完成,直接输出YES
如果没有环,对于每一棵树找一个直径然后就可以了。
//16:00之前做完今天的题! #include<bits/stdc++.h> using namespace std; struct node{ int to,next,w; }e[100010]; int front[1010],g[1010][1010],cnt; int vis[1010]; int b[1010],Max,dis[1010]; void Add(int u,int v,int w){ e[++cnt].to=v;e[cnt].w=w; e[cnt].next=front[u]; front[u]=cnt; } bool circle(int u){ vis[u]=1; if(b[u])return true; b[u]=1; for(int i=front[u];i;i=e[i].next){ int v=e[i].to; if(g[u][v]){ g[v][u]--; if(circle(v))return true; g[v][u]++; } } return false; } void dfs(int u,int fa){ vis[u]=1; for(int i=front[u];i;i=e[i].next){ int v=e[i].to; if(v!=fa){ dis[v]=dis[u]+e[i].w; dfs(v,u); } } } int main(){ freopen("run.in","r",stdin); freopen("run.out","w",stdout); int i,n,m,s; int T; scanf("%d",&T); while(T--){ cnt=0; memset(vis,0,sizeof(vis)); memset(front,0,sizeof(front)); memset(g,0,sizeof(g)); memset(dis,0,sizeof(dis)); scanf("%d%d%d",&n,&m,&s); for(i=1;i<=m;i++){ int u,v,w; scanf("%d%d%d",&u,&v,&w); g[u][v]++;g[v][u]++; Add(u,v,w);Add(v,u,w); } int flag=0; for(i=1;i<=n;i++)if(!vis[i]){ memset(b,0,sizeof(b)); if(circle(i)){ flag=1; break; } } if(flag){ printf("YES\\n");continue; } Max=0; memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) { if(!vis[i]) { int k=0,Maxl=0; dfs(i,0); for(int j=1;j<=n;j++)if(dis[j]>Maxl)k=j,Maxl=dis[j]; memset(dis,0,sizeof(dis)); dfs(k,0); for(int j=1;j<=n;j++)Max=max(Max,dis[j]); } if(Max>=s)break; } if(Max>=s)puts("YES"); else puts("NO"); } return 0; }
总结
我觉得今天考试的题目不是很难,但是就是不在状态。。。希望下次会更好!
以上是关于2017.12.9考试的主要内容,如果未能解决你的问题,请参考以下文章