2013-2014 ACM-ICPC Brazil Subregional Programming Contest

来源:互联网 发布:国产胖熊熊片数据库 编辑:程序博客网 时间:2024/06/08 17:53

A.
题意:给A,B,C三个数,A,B,C ∈ {0,1},如果A,B,C中有一个与其他两个不一样,则输出其标号。不存在则输出’*’
题解:模拟

#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<algorithm>#include<queue>#define LiangJiaJun mainusing namespace std;int a,b,c;int LiangJiaJun(){    cin>>a>>b>>c;    if(a!=b&&a!=c)return puts("A"),0;    if(b!=a&&b!=c)return puts("B"),0;    if(c!=a&&c!=b)return puts("C"),0;    puts("*");    return 0;}

D.
题意:给两个数列,问第一个数列能否经过翻折变成第二个数列,翻折后重叠的格子的数值是直接相加。
题解:暴力dfs

#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<algorithm>#include<queue>#define LiangJiaJun mainusing namespace std;int n,m;int a[24],b[24],ta[24];bool check(int len){     bool l1=0,l2=0;     for(int i=1;i<=len;i++)if(ta[i]!=b[i])l1=1;     for(int i=1;i<=len;i++)if(ta[i]!=b[len-i+1])l2=1;     if(l1&&l2)return 0;return 1;}bool flag=0;int l,r,sv;void dfs(int cur,int len){     if(flag)return;     if(len<m)return;     if(len==m){        if(check(len)){            puts("S");flag=1;        }        return;     }     int tta[24];     for(int i=1;i<len;i++){         l=i,r=len-i;         for(int j=1;j<=len;j++)tta[j]=ta[j];         if(l<r){            for(int k=i,g=i+1;k&&g<=len;k--,g++)ta[g]+=ta[k];            for(int j=1;j<=r;j++)ta[j]=ta[j+l];         }         else{            for(int k=i,g=i+1;k&&g<=len;k--,g++)ta[k]+=ta[g];         }         sv=max(l,r);         dfs(cur+1,sv);         for(int j=1;j<=len;j++)ta[j]=tta[j];     }}int LiangJiaJun(){    scanf("%d",&n);    for(int i=1;i<=n;i++)scanf("%d",&a[i]);    scanf("%d",&m);    for(int i=1;i<=m;i++)scanf("%d",&b[i]);    for(int i=1;i<=n;i++)ta[i]=a[i];    if(n==m){        if(check(n))puts("S");        else puts("N");        return 0;    }    dfs(1,n);    if(!flag)puts("N");    return 0;}

E.
题意:第一行两个数n,r,表示开始是n个潜水员下水,回来时候是r个,求问没回来的潜水员的编号
题解:模拟

#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<algorithm>#include<queue>#define LiangJiaJun mainusing namespace std;int pd[10004],n,r;bool q=0;int LiangJiaJun(){    memset(pd,0,sizeof(pd));    scanf("%d%d",&n,&r);    for(int i=1;i<=r;i++){        int x;scanf("%d",&x);        pd[x]=1;    }    for(int i=1;i<=n;i++)if(!pd[i])printf("%d ",i),q=1;    if(!q)printf("*");    puts("");    return 0;}

F.
题意:一个圆上有n个点将圆分割成n段线段,给你那n条线段的长度,求问那些点能够成多少个等边三角形
题解:二分裸题…..设全部线段长度总和为d,那么能够构成等边三角形的三个点中任意两点之间的劣弧长度一定为d/3

#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<algorithm>#define LiangJiaJun mainusing namespace std;int n,a[100004];int ans=0,lp=0;int erfen(int L,int R,int x){    int mid,l=L,r=R;    while(l<=r){        mid=(l+r)>>1;        if(a[mid]==x)return mid;        if(a[mid]<x)l=mid+1;        else r=mid-1;    }    return -1;}int LiangJiaJun(){    scanf("%d",&n);    for(int i=1;i<=n;i++)scanf("%d",&a[i]);    for(int i=2;i<=n;i++)a[i]+=a[i-1];    lp=a[n]/3;    for(int i=1;i<=n;i++){        int s1,s2,s3;        s1=i;        s2=erfen(s1+1,n,a[s1]+lp);        if(s2==-1)continue;        s3=erfen(s2+1,n,a[s2]+lp);        if(s3==-1)continue;        ++ans;    }    printf("%d\n",ans);    return 0;}

J.
题意:NOIP2013货车运输

#include<iostream>#include<cstring>#include<cstdio>#include<cstdlib>#include<algorithm>#define INF 1999122700#define LiangJiaJun mainusing namespace std;int n,m,s;struct data{int u,v,w;}a[100004];struct edge{int to,nt,w;}e[250004];inline bool dex(data A,data B){return A.w > B.w;}int f[20004];int Find(int x){return (f[x]==x)?f[x]:f[x]=Find(f[x]);}int h[20004],ne=1;int fa[20004][34],d[20004][34],depth[20004];void add(int u,int v,int w){     e[++ne].to=v;e[ne].nt=h[u];h[u]=ne;     e[ne].w=w;}void kruskal(){     for(int i=1;i<=n;i++)f[i]=i;     int tot=0;     for(int i=1;i<=m;i++){         int p=Find(a[i].u),q=Find(a[i].v);         if(p!=q){            f[p]=q;            add(a[i].u,a[i].v,a[i].w);            add(a[i].v,a[i].u,a[i].w);         }     }}void dfs(int x){     for(int i=1;fa[fa[x][i-1]][i-1];i++){         fa[x][i]=fa[fa[x][i-1]][i-1];         d[x][i]=min(d[x][i-1],d[fa[x][i-1]][i-1]);     }     for(int i=h[x];i;i=e[i].nt){         if(!depth[e[i].to]){             depth[e[i].to]=depth[x]+1;             fa[e[i].to][0]=x;             d[e[i].to][0]=e[i].w;             dfs(e[i].to);         }     }}int lca(int u,int v){    if(depth[u]<depth[v])swap(u,v);    int dva=(depth[u]-depth[v]);    for(int i=0;i<=17;i++)if(dva&(1<<i))u=fa[u][i];    if(u==v)return u;    for(int i=17;i>=0;i--){        if(fa[u][i]!=fa[v][i]){            u=fa[u][i];            v=fa[v][i];        }    }    if(u==v)return u;    return fa[u][0];}int query(int x,int f){    int dva=depth[x]-depth[f],ans=INF;    for(int i=0;i<=17;i++){        if(dva&(1<<i)){            ans=min(ans,d[x][i]);            x=fa[x][i];        }    }    return ans;}int LiangJiaJun(){    memset(fa,0,sizeof(fa));    memset(d,127/3,sizeof(d));    scanf("%d%d%d",&n,&m,&s);    for(int i=1;i<=m;i++)        scanf("%d%d%d",&a[i].u,&a[i].v,&a[i].w);    sort(a+1,a+m+1,dex);    kruskal();    for(int i=1;i<=n;i++){        if(!depth[i]){            depth[i]=1;            dfs(i);        }    }    for(int i=1;i<=s;i++){        int x,y,t;        scanf("%d%d",&x,&y);        if(Find(x)!=Find(y))puts("0");        t=lca(x,y);        printf("%d\n",min(query(x,t),query(y,t)));    }    return 0;}
阅读全文
0 0
原创粉丝点击