现在的位置: 首页 > 综合 > 正文

130310周赛

2013年06月25日 ⁄ 综合 ⁄ 共 4961字 ⁄ 字号 评论关闭

A。胜利大逃亡

HDU 1253

很简单的三维BFS,直接贴代码。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <stack>
#include <map>
#include <iomanip>
#define PI acos(-1.0)
#define Max 2000005
#define inf 1<<28
#define LL(x) (x<<1)
#define RR(x) (x<<1|1)
#define ll long long

using namespace std;

struct kdq
{
    int x,y,z,step;
};
int movex[6]={0,0,1,-1,0,0};
int movey[6]={0,0,0,0,1,-1};
int movez[6]={1,-1,0,0,0,0};
bool visit[51][51][51];
int mm[100][100][100];
int A,B,C,T;
int inmap(kdq a)
{
    if(a.x>=0&&a.x<A&&a.y>=0&&a.y<B&&a.z>=0&&a.z<C)
    return 1;
    return 0;
}
kdq q[Max];
int  bfs()
{

    int num=0,cnt=0;
    q[0].x=0,q[0].y=0,q[0].z=0,q[0].step=0;
    visit[0][0][0]=1;
    num++;
    while(num>cnt)
    {
        kdq temp=q[cnt++];
        //cout<<temp.x<<" "<<temp.y<<" "<<temp.z<<endl;
        if(temp.x==(A-1)&&temp.y==(B-1)&&temp.z==(C-1))
        {
           return temp.step;
        }
        for(int i =0 ;i < 6 ;i ++)
        {
            kdq next;
            next.x=temp.x+movex[i];
            next.y=temp.y+movey[i];
            next.z=temp.z+movez[i];
            //cout<<next.x<<" "<<next.y <<" "<<next.z<<endl;
            next.step=temp.step+1;
            if(inmap(next)&&!visit[next.x][next.y][next.z]&&!mm[next.x][next.y][next.z])
            {
                q[num++]=next;
                visit[next.x][next.y][next.z]=1;
            }
        }
    }
    return -1;
}
int main()
{
    int t;
    cin>>t;
    while (t--)
    {
        scanf("%d%d%d%d",&A,&B,&C,&T);
        memset(visit,0,sizeof(visit));
        for( int i =0 ;i < A ; i ++)
        {
            for (int j =0 ;j < B ;j ++)
            {
                for (int k = 0; k < C ; k ++)
                {
                    scanf("%d",&mm[i][j][k]);
                }
            }
        }
        int ans=bfs();
        if(ans<=T)
        cout<<ans<<endl;
        else
        cout<<-1<<endl;
    }
    return 0;
}

B。prim ring problem 

HDU 1016

题目意思很简单,我的作法就是从1开始dfs找到即输出,这样可以保证是按照字典序,然后就是dfs的细节了,写的有点粗糙,下次改=。=现在脑袋好乱。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <stack>
#include <map>
#include <iomanip>
#define PI acos(-1.0)
#define Max 2000005
#define inf 1<<28
#define LL(x) (x<<1)
#define RR(x) (x<<1|1)
#define ll long long

using namespace std;

int vis[1000];
bool isvis[1000];
bool flag[1000];
void isprime()//素数表,数据不大,所以100以内就够了
{
    flag[0]=1;
    flag[1]=1;
    for( int i = 2 ; i < 100 ; i ++)
    {
        if(!flag[i])
        {
            for (int j = i*2 ; j < 100 ; j+= i)
                flag[j]=1;
        }
    }
}

void dfs(int n,int pre,int num)
{
    if(n == num&&!flag[1+pre])//找到即输出 ,这里输出有点麻烦,一开始是用vector的 。。但是忘了earse的用法,怒跪,所以下次改。
    {
        cout<<1;

        for(int i=2;i <=n ;i++)
        {
            for (int j = 2 ;j <=n ; j ++)
            {
                if(vis[j]==i)
                {
                    cout<<" "<<  j;
                    continue;
                }
            }
        }
        cout<<endl;
    }
    for (int i = 1 ; i <= n ; i++)
    {
        if(!vis[i])
        {
            if(!flag[i+pre])
            {
                vis[i]=num+1;
                int k=num;
                k++;
                dfs(n,i,k);
                vis[i]=0;

            }
        }
    }
}

int main()
{
    int n ;
    isprime();
    int cas=1;
    while(cin >> n )
    {
        printf("Case %d:\n",cas++);
        vis[1] = 1;
        dfs(n,1,1);
        cout << endl;
    }

}

C。Tetris

HDU3647

大模拟。还没做

D。seaside 

HDU 3665

题意:一个人从0开始到最近的海边的路程。

思路:数据超小,直接枚举所有的路取最小值=。=

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <stack>
#include <map>
#include <iomanip>
#define PI acos(-1.0)
#define Max 2000005
#define inf 1<<28
#define LL(x) (x<<1)
#define RR(x) (x<<1|1)
#define ll long long

using namespace std;

int mm[20][20];
int side[100];
int ans=inf;
int n;
bool vis[100];
void dfs(int now,int num,int ok)//now表示走到哪里,num表示走的路程 ,ok表示是否到海边
{
    if(ok)
    {
        ans=min(ans,num);
        return ;
    }
    for (int i = 0 ; i < n ; i ++)
    {
        if(!vis[i])
        {
            if(mm[now][i])
            {
                vis[i]=1;
                int k =num ;
                k+=mm[now][i];
                if(side[i])
                dfs(i,k,1);
                else
                dfs(i,k,0);
                vis[i]=0;
            }
        }
    }
}
int main()
{
    while(cin >> n)
    {
        memset(mm,0,sizeof(mm));
        memset(vis,0,sizeof(vis));
        ans=inf;
        for (int i = 0 ; i < n ; i ++)
        {
            int a,b;
            cin >> a >> b;
            side[i]=b;
            while(a--)
            {
                int x,y;
                cin >> x>> y;
                mm[i][x]=y;
            }
        }
        vis[0]=1;
        dfs(0,0,0);
        cout<<ans<<endl;
    }
}

E。divisibility

HDU3335

题意:给出一堆数字,问你这里面互质的数字最多是多少(题意描述和这里略有不同,但是我是这么理解的,写起来也不复杂,不用想那么多)。

其实这一题我觉得还是有数论的方法的,但是我一看数据范围=。=,就直接决定枚举了。。然后就过了。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <stack>
#include <map>
#include <iomanip>
#define PI acos(-1.0)
#define Max 2000005
#define inf 1<<28
#define LL(x) (x<<1)
#define RR(x) (x<<1|1)
#define ll long long

using namespace std;

ll a[10000];
int main()
{
    int T;
    cin >>T;
    while( T--)
    {
        int n ;
        cin >> n ;
        for (int i =0 ; i < n ; i++ )
            cin >>a[ i];
        sort(a,a+n);
        int ans = 1;
        vector<int>nn;
        for (int k = 0 ; k < n ; k ++)
        {
            nn.clear();
            if(a[k]==1)
                continue;
            int minn = a[k];
            int num = 1 ;
            nn.push_back(minn);//枚举所有的元素,当然1除外
            for (int i = k+1; i < n ; i++)
            {
                if(a[i]!=minn&&a[i]!=1)
                {
                    bool ok = 0;
                    int size=nn.size();
                    for(int j = 0 ; j < size; j++)
                    {
                        if(a[i]%nn[j]==0)
                        {
                            ok = 1;
                            break;
                        }
                    }
                    if(!ok)
                    {
                        nn.push_back(a[i]);
                        num++;
                    }
                }
            }
            ans = max (ans, num);
        }
        cout<<ans<<endl;
    }
}

F。hello world!

hdu3257

找规律,将16进制数转化成2进制,然后1就是#0就是空格,输出即可

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string>
#include <cmath>
#include <cstring>
#include <queue>
#include <set>
#include <vector>
#include <stack>
#include <map>
#include <iomanip>
#define PI acos(-1.0)
#define Max 2000005
#define inf 1<<28
#define LL(x) (x<<1)
#define RR(x) (x<<1|1)
#define ll long long

using namespace std;

int change(char a[])
{
    int x = (a[0] - '0') * 16 ;
    if ( a[1] >= 'A'&& a[ 1] <= 'Z')
        x += a[1] - 'A'+10;
    else
        x += a[1] - '0';
    return x;
}
int Map[10][10000];
int main()
{
    int T;
    cin >> T;
    char  x[1000];
    int cas = 0;
    while ( T--)
    {
        int n ;
        cin >> n;
        memset(Map,0,sizeof(Map));
        int num = 0;
        for (int i = 0 ;i < n; i++)
        {
            num = i*6;
            for (int j =0 ; j < 5; j ++ )
            {
                cin >> x;
                int a = change(x);
                for (int k = 0 ;k < 7 ; k ++)
                {
                    Map[k][num] = a % 2;
                    a /= 2;
                }
                num ++;
            }
        }
        printf("Case %d:\n\n",++cas);
        for (int i = 0 ; i < 7 ; i ++)
        {
            for (int j = 0; j < 6*n-1 ;j++)
            {
                if(Map[i][j])
                cout <<"#";
                else cout<<" ";
            }
            cout <<endl;
        }
        cout << endl;
    }

}

抱歉!评论已关闭.