码迷,mamicode.com
首页 > 其他好文 > 详细

2017.12.9考试

时间:2017-12-09 19:23:22      阅读:191      评论:0      收藏:0      [点我收藏+]

标签:img   std   生成   int   isp   strlen   程序   event   code   

又到了信息课,又开始了考试。

那么我们先来看看今天的题目:

试题

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 
T1

 

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;
}
T2

 

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;
}
T3

 

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;
}
T4

 

总结

我觉得今天考试的题目不是很难,但是就是不在状态。。。希望下次会更好!

2017.12.9考试

标签:img   std   生成   int   isp   strlen   程序   event   code   

原文地址:http://www.cnblogs.com/cj-gjh/p/8012083.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!