码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #290 (Div. 2) A,B,C,D

时间:2015-02-03 17:11:01      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:

这场CF终于当了一次手速狗啊,简直了啊。

A:签到,输出一个蛇形,看着样例找到规律打印路径就可以了。

int main()
{
    int n, m;
    while(cin >>n>>m)
    {
        for(int i = 1; i <= n; i++)
        {
            if(i%2)
            {
                for(int j = 0; j < m; j++)
                    cout<<"#";
                cout<<endl;
            }
            else
            {
                int xp = i/2;
                if(xp%2)
                {
                    for(int j = 0; j < m-1; j++)
                         cout<<".";
                    cout<<"#"<<endl;
                }
                else
                {
                    cout<<"#";
                    for(int j = 0; j < m-1; j++)
                        cout<<".";
                    cout<<endl;
                }
            }
        }
    }
}
B.预处理出来所有点之间的关系然后用dfs判断是否构成环,保证每个点只被搜一次,所以时间复杂度不是很高。

const int maxn = 110;

char str[maxn][maxn];
vector<int>g[maxn*maxn];

int vis[maxn*maxn];

int dx[] = {0, 1, -1, 0};
int dy[] = {1, 0, 0, -1};

int flag;

void dfs(int x, int fa)
{
    int n = g[x].size();
    vis[x] = 1;
    for(int i = 0; i < n; i++)
    {
        int xp = g[x][i];
        if(xp == fa) continue;
        if(vis[xp])
        {
            flag = 1;
            continue;
        }
        else
        {
            dfs(xp, x);
        }
    }
}

int main()
{
    int n, m;
    while(cin >>n>>m)
    {
       for(int i = 1; i <= n; i++)
        scanf("%s",str[i]+1);
        for(int i = 0; i <= n*m; i++)
            g[i].clear();
       for(int i = 1; i <= n; i++)
       {
           for(int j = 1; j <= m; j++)
           {
               int pos = (i-1)*m+j;
               for(int k = 0; k < 4; k++)
               {
                   int x = i+dx[k];
                   int y = j+dy[k];
                   if(x > n || x < 1 || y > m || y < 1) continue;
                   int xpos = (x-1)*m+y;
                   if(str[i][j] == str[x][y])
                   {
                       g[pos].push_back(xpos);
                   }
               }
           }
       }

       memset(vis, 0, sizeof(vis));
       flag = 0;
       for(int i = 1; i <= n*m; i++)
       {
           if(!vis[i])
           {
               dfs(i, -1);
           }
       }
       if(flag) cout<<"Yes"<<endl;
       else cout<<"No"<<endl;
    }
}

C.标准的拓扑排序,建立出来拓扑关系之后,拓扑排序如果有环就说明不可以。好多人多没有判断

2

aa

a

 这种情况,没去hack有点失误。

using namespace std;

const int maxn = 110;

char str[maxn][maxn];

int mp[maxn][maxn];
int in[maxn];
int num[maxn];
int f[maxn];
int main()
{
    int n;
    while(cin >>n)
    {
        for(int i = 0; i < n; i++)
        {
            scanf("%s",str[i]);
        }
        for(int i = 0; i < n; i++)
        {
            num[i] = strlen(str[i]);
        }
        memset(mp, 0, sizeof(mp));
        memset(in, 0, sizeof(in));
        int xflag = 0;
        for(int i = 0; i < n-1; i++)
        {
            int m = min(num[i], num[i+1]);
            int xnum = 0;
            for(int j = 0; j < m; j++)
            {
                if(str[i][j] != str[i+1][j])
                {
                    int x = str[i][j]-'a';
                    int y = str[i+1][j]-'a';
                    if(mp[x][y] == 0)
                    {
                        mp[x][y] = 1;
                        in[y]++;
                    }
                    break;
                }
                xnum++;
            }
            if(xnum == m)
            {
                if(num[i] > num[i+1])
                {
                    xflag = 1;
                }
            }
        }
        if(xflag)
        {
            puts("Impossible");
            continue;
        }
        int num = 0;
        int t;
        while(num != 26)
        {
            int flag = 0;
            for(int i = 0; i < 26; i++)
            {
                if(in[i] == 0)
                {
                    flag = 1;
                    in[i] = -1;
                    f[num++] = i;
                    t = i;
                    break;
                }
            }
            if(!flag) break;
            for(int i = 0; i < 26; i++)
            {
                if(mp[t][i] == 1)
                {
                    in[i]--;
                }
            }
        }
        if(num != 26)
        {
            cout<<"Impossible"<<endl;
            continue;
        }
        for(int i = 0; i < 26; i++)
            printf("%c",'a'+f[i]);
        cout<<endl;
    }
}

D.思路出了问题,应该是找到一些数使得他们的最大公约数为1,这样一定会到达所有的点,类似于ax+by = 1,找出来最小的解是的满足最大公约数为1,且花费最小。可以用map来存这样就解决了,开静态内存太大的问题,当然也可以离散来存数据。

const int maxn = 30010;

using namespace std;

int main()
{
    int n;
    while(cin >>n)
    {
        vector<int>f;
        vector<int>p;
        int x;
        for(int i = 0; i < n; i++)
        {
            cin >>x;
            f.push_back(x);
        }
        for(int i = 0; i < n; i++)
        {
            cin >>x;
            p.push_back(x);
        }
        map<int, int> mp;
        map<int, int>::iterator it;
        for(int i = 0; i < n; i++)
        {
            int &x = mp[f[i]];
            if(x == 0) x = p[i];
            else x = min(p[i], x);
            for(it = mp.begin(); it != mp.end(); it++)
            {
                int &y = mp[__gcd(f[i], it->first)];
                if(y == 0) y = p[i]+it->second;
                else y = min(y, p[i]+it->second);
            }
        }
        if(mp[1])
        {
            cout<<mp[1]<<endl;
            continue;
        }
        puts("-1");
    }
}



Codeforces Round #290 (Div. 2) A,B,C,D

标签:

原文地址:http://blog.csdn.net/xu12110501127/article/details/43451599

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!