Quantcast
Channel: CSDN博客推荐文章
Viewing all articles
Browse latest Browse all 35570

130310周赛

$
0
0

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

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

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

#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

还没做,比赛时没做出来=。=因为没找出规律。。。

然后看了一句话就瞬间懂了=。=,这题考的显然就是想象力=。=

明天来贴。



作者:kdqzzxxcc 发表于2013-3-14 0:39:25 原文链接
阅读:115 评论:0 查看评论

Viewing all articles
Browse latest Browse all 35570

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>