130825组队赛-Regionals 2012, North America - East Central NA

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("\n");
    }
    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\n",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\n",id[6]);
        }
        else
        {
            printf("No solution\n");
        }
    }
    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\n",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\n",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\n",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\n",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;
}


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

 

 

posted @ 2013-08-27 19:23  pangbangb  阅读(199)  评论(0编辑  收藏  举报