Code forces Round #510 div2

来源:互联网 发布:手机火车票订票软件 编辑:程序博客网 时间:2024/03/28 19:56

A 水题: 画图

#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <algorithm>#include <string>using namespace std;int main(){    int n, m;    char s1[55], s2[55], s3[55];    cin>>n>>m;    for(int i = 0; i < m; i++)    {        s1[i] = '#';        s2[i] = '.';        s3[i] = '.';        if(!i)            s2[i] = '#';        if(i == m - 1)            s3[i] = '#';    }    s1[m] = 0;    s2[m] = 0;    s3[m] = 0;    int cnt = 1, leap = 1;    while(1)    {        if(cnt > n) break;        if(cnt & 1){            cout<<s1<<endl;        }        else if(leap){            cout<<s3<<endl;            leap = 0;        }        else{            cout<<s2<<endl;            leap = 1;        }        cnt++;    }    return 0;}

 

B :dfs即可

#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <algorithm>#include <string>using namespace std;int dx, dy;int n, m;int dir[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};int vis[55][55];char ss[55][55];int mark[55][55];bool isin(int x, int y){    if(x >= 0 && x < n && y >= 0 && y < m)        return true;    return false;}int dfs(int x, int y, int z){    vis[x][y] = 1;    for(int i = 0; i < 4; i++)    {        int nx = x + dir[i][0];        int ny = y + dir[i][1];        if(nx == dx && ny == dy && z >= 3)            return 1;        if(isin(nx, ny) && !vis[nx][ny] && ss[nx][ny] == ss[x][y])        {            if(!mark[nx][ny]) continue;            if(dfs(nx, ny, z + 1)) return 1;            else mark[nx][ny] = 0;        }            }    return 0;}int main(){    cin>>n>>m;    for(int i = 0; i < n; i++)        for(int j = 0; j < m; j++)            cin>>ss[i][j];    memset(mark, -1, sizeof mark);    for(int i = 0; i < n; i++)        for(int j = 0; j < m; j++)        {            memset(vis, 0, sizeof(vis));            memset(mark, -1, sizeof mark);            dx = i, dy = j;            if(dfs(i, j, 1)){                cout<<"Yes"<<endl;                return 0;            }        }    cout<<"No"<<endl;    return 0;}

C:相邻的字符串建图,然后拓扑排序即可

#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <algorithm>#include <string>using namespace std;char ss[105][105];int as[30][30];int id[30];char ans[30];void init(){    memset(as, 0, sizeof as);    memset(id, 0, sizeof id);}int topu_sort(){    int cnt = 0;    queue<int> que;    while(!que.empty())        que.pop();    for(int i = 0; i < 26; i++)    {        if(!id[i])            que.push(i);    }    while(!que.empty())    {        int now = que.front();        que.pop();        ans[cnt++] = now + 'a';        for(int i = 0; i < 26; i++)        {            if(as[now][i])            {                id[i]--;                if(id[i] == 0)                    que.push(i);            }        }    }    ans[26] = 0;    if(cnt < 26)        return 0;    return 1;}int main(){    int t;    cin>>t;    for(int i = 0; i < t; i++)        cin>>ss[i];    init();    for(int i = 0; i < t - 1; i++)    {                int len1 = strlen(ss[i]), len2 = strlen(ss[i + 1]), p = 0;        while(p < min(len1, len2) && ss[i][p] == ss[i + 1][p]) p++;        if(p == len1 && len1 <= len2) continue;        if(p == len2 && len2 < len1){            cout<<"Impossible"<<endl;            return 0;        }        if(as[ss[i][p] - 'a'][ss[i + 1][p] - 'a'])            continue;        as[ss[i][p] - 'a'][ss[i + 1][p] - 'a'] = 1;        id[ss[i + 1][p] - 'a']++;    }        if(topu_sort())        cout<<ans<<endl;    else        cout<<"Impossible"<<endl;    return 0;}

D:利用map动态规划 注意输入有重边需更新

#include <iostream>#include <cstdio>#include <cstring>#include <queue>#include <algorithm>#include <string>#include <map>using namespace std;int gcd(int a, int b){    if(b == 0) return a;    return gcd(b, a % b);}int main(){    int n;    cin>>n;    int a[305];    long long b[305];    for(int i = 0; i < n; i++)    {        cin>>a[i];    }    for(int i = 0; i < n; i++)    {        cin>>b[i];    }    map<int, long long int> std;        for(int i = 0; i < n; i++)    {        if(std.count(a[i]))        {            std[a[i]] = min(std[a[i]], b[i]);        }        else std.insert(pair<int, long long int>(a[i], b[i]));    }        for(int i = 1; i < n; i++)    {        map<int, long long int>::iterator it;        for(it = std.begin(); it != std.end(); it++)        {            int ans = gcd(it->first, a[i]);            if(std.count(ans))            {                std[ans] = min((long long)it->second + b[i], std[ans]);            }            else {                std.insert(pair<int, long long int>(ans, (long long)b[i] + it->second));            }        }    }    if(std.count(1))        cout<<std[1]<<endl;    else        cout<<-1<<endl;    return 0;}




0 0
原创粉丝点击