• 130825组队赛-Regionals 2012, North America


    A.Babs' Box Boutique

    一道简单的dfs搜索题,需要两两比较,然后搜到底,得到最大值就行了。比赛时队友写的,我只负责debug。。赛后自己写的。。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<set>
    #include<vector>
    #include<stack>
    #define mem(a,b) memset(a,b,sizeof(a))
    #define FOR(a,b,i) for(i=a;i<=b;++i)
    #define For(a,b,i) for(i=a;i<b;++i)
    #define N 1000000007
    using namespace std;
    inline void RD(int &ret)
    {
        char c;
        do
        {
            c=getchar();
        }
        while(c<'0'||c>'9');
        ret=c-'0';
        while((c=getchar())>='0'&&c<='9')
        {
            ret=ret*10+(c-'0');
        }
    }
    inline void OT(int a)
    {
        if(a>=10)
        {
            OT(a/10);
        }
        putchar(a%10+'0');
    }
    struct xl
    {
        int x,y,z;
    } a[11];
    int n,ans,v[11];
    void dfs(int x,int y,int d)
    {
        ans=max(d,ans);
        if(d==n)
        {
            return ;
        }
        int i;
        for(i=0; i<n; ++i)
        {
            if(v[i]==0)
            {
                if(a[i].x>=x&&a[i].y>=y)//对应比较
                {
                    v[i]=1;
                    dfs(a[i].x,a[i].y,d+1);
                    v[i]=0;
                }
                else if(a[i].x>=x&&a[i].z>=y)
                {
                    v[i]=1;
                    dfs(a[i].x,a[i].z,d+1);
                    v[i]=0;
                }
                else if(a[i].y>=x&&a[i].z>=y)
                {
                    v[i]=1;
                    dfs(a[i].y,a[i].z,d+1);
                    v[i]=0;
                }
            }
        }
    }
    int main()
    {
        int i,t[4],cas=0;
        while(1)
        {
            RD(n);
            if(n==0)
            {
                break;
            }
            cas++;
            for(i=0; i<n; ++i)
            {
                RD(t[0]);
                RD(t[1]);
                RD(t[2]);
                sort(t,t+3);//注意排序
                a[i].x=t[0];
                a[i].y=t[1];
                a[i].z=t[2];
            }
            ans=0;
            mem(v,0);
            dfs(0,0,0);
            printf("Case %d: ",cas);
            OT(ans);
            printf("
    ");
        }
        return 0;
    }

    B.Flash Mob

    简单的求中位数和曼哈顿距离,直接对xi和yi分别排序,然后取中位数,中位数与其他点求曼哈顿距离。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<set>
    #include<vector>
    #include<stack>
    #define mem(a,b) memset(a,b,sizeof(a))
    #define FOR(a,b,i) for(i=a;i<=b;++i)
    #define For(a,b,i) for(i=a;i<b;++i)
    #define N 1000000007
    using namespace std;
    inline void RD(int &ret)
    {
        char c;
        do
        {
            c=getchar();
        }
        while(c<'0'||c>'9');
        ret=c-'0';
        while((c=getchar())>='0'&&c<='9')
        {
            ret=ret*10+(c-'0');
        }
    }
    inline void OT(int a)
    {
        if(a>=10)
        {
            OT(a/10);
        }
        putchar(a%10+'0');
    }
    int x[1001],y[1001],n;
    int f(int a,int b)
    {
        int sum=0,i;
        FOR(1,n,i)
        {
            sum+=abs(a-x[i]+b-y[i]);
        }
        return sum;
    }
    int main()
    {
        int i,cas=0;
        while(1)
        {
            RD(n);
            if(n==0)
            {
                break;
            }
            cas++;
            for(i=1;i<=n;++i)
            {
                scanf("%d%d",&x[i],&y[i]);
            }
            sort(x+1,x+n+1);
            sort(y+1,y+n+1);
            printf("Case %d: (%d,%d) %d
    ",cas,x[(1+n)/2],y[(n+1)/2],f(x[(1+n)/2],y[(n+1)/2]));
        }
        return 0;
    }


    C.Hexagon Perplexagon

    一道枚举题,可以dfs搜,也可以用next_permutation得到所有情况然后暴力查找符合条件的值,我用的是next_permutation,险过。。。需要用到二维数组标记。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<set>
    #include<vector>
    #include<stack>
    #define mem(a,b) memset(a,b,sizeof(a))
    #define FOR(a,b,i) for(i=a;i<=b;++i)
    #define For(a,b,i) for(i=a;i<b;++i)
    #define N 1000000007
    using namespace std;
    inline void RD(int &ret)
    {
        char c;
        do
        {
            c=getchar();
        }
        while(c<'0'||c>'9');
        ret=c-'0';
        while((c=getchar())>='0'&&c<='9')
        {
            ret=ret*10+(c-'0');
        }
    }
    inline void OT(int a)
    {
        if(a>=10)
        {
            OT(a/10);
        }
        putchar(a%10+'0');
    }
    int a[11][11],p[11][11],id[11],high[11],low[11];
    int main()
    {
        int t,i,j,tt,cas=0;
        bool f,g;
        RD(t);
        while(t--)
        {
            cas++;
            for(i=0; i<7; ++i)
            {
                id[i]=i;
                for(j=0; j<6; ++j)
                {
                    RD(a[i][j]);
                }
                for(j=0; j<6; ++j)
                {
                    p[i][a[i][j]]=j;//标记数组
                }
            }
            f=false;
            do
            {
                for(i=1; i<7; ++i)
                {
                    tt=p[id[0]][1]+i-1;
                    if(tt>=6)
                    {
                        tt-=6;
                    }
                    j=a[id[0]][tt];
                    tt=p[id[i]][j]+1;
                    if(tt>=6)
                    {
                        tt-=6;
                    }
                    low[i]=a[id[i]][tt];
                    tt=p[id[i]][j]-1;
                    if(tt<0)
                    {
                        tt+=6;
                    }
                    high[i]=a[id[i]][tt];
                }
                low[7]=low[1];
                g=true;
                for(i=1; i<7; ++i)
                {
                    if(high[i]!=low[i+1])//左右比较
                    {
                        g=false;
                        break;
                    }
                }
                if(g==true)
                {
                    f=true;
                    break;
                }
            }
            while(next_permutation(id,id+7));
            printf("Case %d: ",cas);
            if(f==true)
            {
                for(i=0; i<6; ++i)
                {
                    printf("%d ",id[i]);
                }
                printf("%d
    ",id[6]);
            }
            else
            {
                printf("No solution
    ");
            }
        }
        return 0;
    }


    D.I've Got Your Back(gammon)

    一道映射题,表示不同的检索方式和不同的数代表不同的序列。。。直接暴力就行。

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<set>
    #include<vector>
    #include<stack>
    #define mem(a,b) memset(a,b,sizeof(a))
    #define FOR(a,b,i) for(i=a;i<=b;++i)
    #define For(a,b,i) for(i=a;i<b;++i)
    #define N 1000000007
    using namespace std;
    inline void RD(int &ret)
    {
        char c;
        do
        {
            c=getchar();
        }
        while(c<'0'||c>'9');
        ret=c-'0';
        while((c=getchar())>='0'&&c<='9')
        {
            ret=ret*10+(c-'0');
        }
    }
    inline void OT(int a)
    {
        if(a>=10)
        {
            OT(a/10);
        }
        putchar(a%10+'0');
    }
    int a[6],an[6],num,f[6][16][16];
    char c[2];
    void init()
    {
        int i,j,k;
        For(0,6,j)
        {
            For(0,16,i)
            {
                For(0,16,k)
                {
                    f[j][i][k]=0;
                }
            }
        }
    }
    int main()
    {
        init();
        int i,j,k,l;
        FOR(1,15,i)//预处理
        {
            FOR(1,15,j)
            {
    
                if(j==i)
                {
                    f[0][j][i]=1;
                }
                else
                {
                    f[0][j][i]=0;
                }
                f[0][0][i]+=f[0][j][i];
            }
        }
        For(1,6,k)
        {
            FOR(1,15,j)
            {
                f[k][j][j]=1;
                f[k][0][j]+=1;
                for(i=j+1; i<=15; i++)
                {
                    for(l=k-1; l>=0; l--)
                    {
                        f[k][j][i]+=f[l][0][i-j];
                    }
                    f[k][0][i]+=f[k][j][i];
                }
            }
        }
        int cas=0,num,sum,ans,tmp;
        while(scanf("%s",c))
        {
            cas++;
            if(c[0]=='m')
            {
                For(0,6,i)
                {
                    RD(a[i]);
                }
                num=15;
                ans=0;
                For(0,6,j)
                {
                    if(a[j]>0)
                    {
                        for(i=4-j; i>=0; i--)
                        {
                            for(k=num-a[j]+1; k<=num; k++)
                            {
                                ans+=f[i][0][k];
                            }
                        }
                    }
                    num-=a[j];
                    if(num==0)
                    {
                        ans++;
                        break;
                    }
                }
                printf("Case %d: %d
    ",cas,ans-1);
            }
            else if(c[0]=='u')
            {
                For(0,6,j)
                {
                    an[j]=0;
                }
                scanf("%d",&sum);
                sum++;
                num=15;
                ans=0;
                while(num>0)
                {
                    ans=0;
                    for(j=0; j<6; j++)
                    {
                        ans+=f[j][0][num];
                        if(ans>=sum)
                        {
                            break;
                        }
                    }
                    if(ans==sum)
                    {
                        an[j]=num;
                        break;
                    }
                    ans-=f[j][0][num];
                    sum-=ans;
                    FOR(1,num,i)
                    {
                        tmp=0;
                        For(0,j,k)
                        {
                            tmp+=f[k][0][num-i];
                        }
                        if(tmp>=sum)
                        {
                            break;
                        }
                        else
                        {
                            sum-=tmp;
                        }
                    }
                    num-=i;
                    an[j]=i;
                }
                printf("Case %d: %d %d %d %d %d %d
    ",cas,an[5],an[4],an[3],an[2],an[1],an[0]);
            }
            else
            {
                break;
            }
        }
        return 0;
    }


    F.Road Series

    。。。UESTC和UVALive两个source的题目限时不同,我一直交UESTC,TLE到死。。。。

    交了UVALive就A了,我不想再说什么了,无力了~~~~~~

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<set>
    #include<vector>
    #include<stack>
    #define mem(a,b) memset(a,b,sizeof(a))
    #define FOR(a,b,i) for(i=a;i<=b;++i)
    #define For(a,b,i) for(i=a;i<b;++i)
    #define N 1000000007
    using namespace std;
    inline void RD(int &ret)
    {
        char c;
        do
        {
            c=getchar();
        }
        while(c<'0'||c>'9');
        ret=c-'0';
        while((c=getchar())>='0'&&c<='9')
        {
            ret=ret*10+(c-'0');
        }
    }
    inline void OT(int a)
    {
        if(a>=10)
        {
            OT(a/10);
        }
        putchar(a%10+'0');
    }
    set<int>p;
    set<int>::iterator it;
    string q[1001],ss;
    char s[1001];
    int k,w,tt;
    int main()
    {
        int t,cas=0,m,i,j,l,sum,a,o;
        bool f;
        RD(t);
        while(t--)
        {
            cas++;
            scanf("%d%d",&k,&w);
            gets(s);
            p.clear();
            m=0;
            for(o=0;o<k;++o)
            {
                gets(s);
                tt=0;
                l=strlen(s);
                ss="";
                for(j=0; j<l; ++j)
                {
                    if(s[j]>='0'&&s[j]<='9')
                    {
                        ss+=s[j];
                    }
                    else
                    {
                        q[tt++]=ss;
                        ss="";
                    }
                }
                if(s[l-1]>='0'&&s[l-1]<='9')
                {
                    q[tt++]=ss;
                }
                while(true)
                {
                    if(p.find(m+1)!=p.end())
                    {
                        p.erase(m+1);
                        ++m;
                        continue;
                    }
                    for(i=1; i<=w; ++i)
                    {
                        ss="";
                        a=m+i;
                        if(a==0)
                        {
                            ss="0";
                        }
                        while(a)
                        {
                            ss=char(a%10+48)+ss;
                            a/=10;
                        }
                        f=false;
                        for(j=0; j<tt; ++j)
                        {
                            if(q[j].find(ss)!=-1)
                            {
                                f=true;
                                break;
                            }
                        }
                        if(f)
                        {
                            p.insert(m+i);
                        }
                    }
                    if (p.find(m+ 1)!=p.end())
                    {
                        continue;
                    }
                    break;
                }
            }
            sum=m;
            for(it=p.begin(); it != p.end(); it++)
            {
                sum=max(sum,*it);
            }
            printf("Case %d: %d %d
    ",cas,m,sum);
        }
        return 0;
    }


    G.Show Me the Money

    汇率兑换,需要用到弗洛伊德算法求最短路的方式得到兑换方式。。。没考虑太多,居然1A,学长说题目说没有重边,但数据里有。。。额,我也没仔细看太清题目,喜闻乐见了~~~

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #include<string>
    #include<cmath>
    #include<set>
    #include<vector>
    #include<stack>
    #include<map>
    #define mem(a,b) memset(a,b,sizeof(a))
    #define FOR(a,b,i) for(i=a;i<=b;++i)
    #define For(a,b,i) for(i=a;i<b;++i)
    #define N 1000000007
    using namespace std;
    inline void RD(int &ret)
    {
        char c;
        do
        {
            c=getchar();
        }
        while(c<'0'||c>'9');
        ret=c-'0';
        while((c=getchar())>='0'&&c<='9')
        {
            ret=ret*10+(c-'0');
        }
    }
    inline void OT(int a)
    {
        if(a>=10)
        {
            OT(a/10);
        }
        putchar(a%10+'0');
    }
    map<string,int>q;
    string ss[11];
    long long a[11][11];
    int ans,m;
    string p1,p2,p;
    void f()
    {
        int i,j,k,id,num,l;
        long long sum=-1,in,aa,bb;
        char h[22];
        FOR(1,ans,i)//floyd
        {
            FOR(1,ans,j)
            {
                if(i!=j)
                {
                    FOR(1,ans,k)
                    {
                        if(i!=k&&j!=k)//去重边
                        {
                            if(a[j][i]==0||a[i][j]==0)
                            {
                                continue;
                            }
                            if(a[j][k]!=0)
                            {
                                continue;
                            }
                            a[j][k]=a[j][i]*a[i][k];
                            a[k][j]=a[k][i]*a[i][j];
                        }
                    }
                }
            }
        }
        id=q[p];
        FOR(1,ans,i)
        {
            if(i!=id&&a[i][id]!=0)
            {
                in=(long long)m*a[i][id]/a[id][i];
                if(in*a[id][i]<(long long)m*a[i][id])
                {
                    in++;
                }
                if(in<=100000)
                {
                    if(sum==-1||in*a[id][i]*bb<sum*aa*a[i][id])
                    {
                        sum=in;
                        num=i;
                        aa=a[id][i];
                        bb=a[i][id];
                    }
                }
            }
        }
        l=ss[num].size();
        for(i=0; i<l; ++i)
        {
            h[i]=ss[num][i];
        }
        h[l]=0;
        printf("%lld %s
    ",sum,h);
    }
    int main()
    {
        int t,i,cas=0,x,y;
        char s[11],s1[11],s2[11];
        while(1)
        {
            RD(t);
            if(t==0)
            {
                break;
            }
            cas++;
            q.clear();
            ans=0;
            mem(a,0);
            while(t--)
            {
                scanf("%d%s%s%d%s",&x,s1,s,&y,s2);
                p1.assign(s1);
                p2.assign(s2);
                if(q[p1]==0)//map去重
                {
                    q[p1]=++ans;
                }
                ss[q[p1]]=p1;
                if(q[p2]==0)
                {
                    q[p2]=++ans;
                }
                ss[q[p2]]=p2;
                a[q[p1]][q[p2]]=x;
                a[q[p2]][q[p1]]=y;
            }
            scanf("%d%s",&m,s);
            printf("Case %d: ",cas);
            p.assign(s);
            f();
        }
        return 0;
    }


    这次做得还行,但前面的水题出得太慢了,导致其它题也没怎么看。。。

  • 相关阅读:
    1212. 地宫取宝
    895. 最长上升子序列
    高層タワー [MISSION LEVEL: B]
    分组背包
    多重背包
    1015. 摘花生
    1211. 蚂蚁感冒
    1205. 买不到的数目
    SQL基础教程(第2版)第4章 数据更新:4-2 数据的删除(DELETE)
    SQL基础教程(第2版)第4章 数据更新:4-1 数据的插入(INSERT)
  • 原文地址:https://www.cnblogs.com/pangblog/p/3285806.html
Copyright © 2020-2023  润新知