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

130720CF解题报告

2019年02月10日 ⁄ 综合 ⁄ 共 3381字 ⁄ 字号 评论关闭

A - Cakeminator

简单的模拟。。就这我还写了好久。。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;

int r,c;
char s[15][15];
bool used[15][15];
char cc;
int sum;
int shu;

int main()
{
    scanf("%d%d",&r,&c);
    memset(used,0,sizeof(used));
    sum = 0;
    for(int i=0;i<r;i++)
    {
        cc = getchar();
        for(int j=0;j<c;j++)
        {
            s[i][j] = getchar();
        }
    }
    int q = 0;
    for(int i=0;i<r;i++)
    {
        shu = 0;
        q = 0;
        for(int j=0;j<c;j++)
        {
            if(s[i][j] == '.'&&used[i][j] == 0)
            {
                shu++;
            }
            else if(s[i][j] != '.')
            {
                q = 1;
                break;
            }
        }
        if(q == 0)
        {
            sum += shu;
            for(int j=0;j<c;j++)
            {
                used[i][j] = 1;
            }
        }
    }
    for(int i=0;i<c;i++)
    {
        shu = 0;
        q = 0;
        for(int j=0;j<r;j++)
        {
            if(s[j][i] == '.'&&used[j][i] == 0)
            {
                shu++;
            }
            else if(s[j][i] != '.')
            {
                q = 1;
                break;
            }
        }
        if(q == 0)
        {
            sum += shu;
            for(int j=0;j<c;j++)
            {
                used[j][i] = 1;
            }
        }
    }
    printf("%d\n",sum);
    return 0;
}

B - Road Construction

因为0<m<n/2,肯定会有未连接的空点,找空点就行了。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;

int n,m;
int s[1005];

int main()
{
    int x,y,q;
    memset(s,0,sizeof(s));
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++)
    {
        scanf("%d%d",&x,&y);
        s[x]++;
        s[y]++;
    }
    for(int i=1;i<=n;i++)
    {
        if(s[i] == 0)
        {
            q = i;
            break;
        }
    }
    printf("%d\n",n-1);
    for(int i=1;i<=n;i++)
    {
        if(i != q)
        {
            printf("%d %d\n",i,q);
        }
    }
    return 0;
}

C - Purification

一开始以为必须要所有选择的点没有交集,结束就只是单纯的搜索行搜索列,还因为之前的误解写成了DFS,伤心啊。。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;

int n,q;
char s[105][105];
bool used[105][105];
int dx[105];
int dy[105];
int shu;
char c;

void dfsh(int xx)
{
    for(int i=1; i<=n; i++)
    {
        if(s[xx][i] == '.'&&shu != n)
        {
            if(shu != n)
            {
                dx[shu] = xx;
                dy[shu] = i;
                shu++;
                dfsh(xx+1);
            }
        }
    }
    if(shu != n)
    {
        shu--;
    }
}

void dfsl(int xx)
{
    for(int i=1; i<=n; i++)
    {
        if(s[i][xx] == '.'&&shu != n)
        {
            if(shu != n)
            {
                dx[shu] = i;
                dy[shu] = xx;
                shu++;
                dfsl(xx+1);
            }
        }
    }
    if(shu != n)
    {
        shu--;
    }
}

int main()
{
    scanf("%d",&n);
    for(int i=1; i<=n; i++)
    {
        c = getchar();
        for(int j=1; j<=n; j++)
        {
            s[i][j] = getchar();
        }
    }
    shu = 0;
    dfsh(1);
    if(shu < n)
    {
        shu = 0;
        dfsl(1);
    }
    if(shu == n)
    {
        for(int i=0; i<n; i++)
        {
            printf("%d %d\n",dx[i],dy[i]);
        }
    }
    else
    {
        printf("-1\n");
    }
    return 0;
}

D - Biridian Forest

从终点E开始往回搜索查距离的简单BFS,比赛的时候没想到这么弄,写成DFS直接TLE了。。

#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>

using namespace std;

int n,m;
char s[1005][1005];
bool used[1005][1005];
char c;
int xf[5] = {1,0,-1,0};
int yf[5] = {0,-1,0,1};
int sx,sy,swei,ex,ey,l,ll,q;
struct node
{
    int dx,dy,dshu,dwei;
}d[1000005];
int shu;

bool cmp(node x,node y)
{
    return x.dwei < y.dwei;
}

void bfs(int xx,int yy)
{
    l++;
    used[xx][yy] = 1;
    for(int i=0;i<4;i++)
    {
        if(s[xx+xf[i]][yy+yf[i]] != 'T'&&used[xx+xf[i]][yy+yf[i]]==0)
        {
            if(s[xx+xf[i]][yy+yf[i]] == 'E')
            {
                if(l < ll)
                {
                    ll = l;
                }
            }
            else
            {
                dfs(xx+xf[i],yy+yf[i]);
            }
        }
    }
    l--;
    used[xx][yy] = 0;
}

int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<=1001;i++)
    {
        for(int j=0;j<=1001;j++)
        {
            used[i][j] = 1;
        }
    }
    for(int i=1;i<=n;i++)
    {
        c = getchar();
        for(int j=1;j<=m;j++)
        {
            s[i][j] = getchar();
        }
    }
    /*for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cout<<s[i][j];
        }
        cout<<endl;
    }*/
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            l = 0;
            ll = 1000000;
            if(s[i][j] == 'S')
            {
                for(int ii=1;ii<=n;ii++)
                {
                    for(int jj = 1;jj<=m;jj++)
                    {
                        used[ii][jj] = 0;
                    }
                }
                dfs(i,j);
                sx = i;
                sy = j;
                swei = ll;
                //cout<<ll<<endl<<"aaaaaaaa"<<endl;
            }
            else if(s[i][j] > '0' && s[i][j] <= '9')
            {
                //cout<<s[i][j]<<endl;
                //cout<<i<<' '<<j<<endl;
                for(int ii=1;ii<=n;ii++)
                {
                    for(int jj = 1;jj<=m;jj++)
                    {
                        used[ii][jj] = 0;
                    }
                }
                dfs(i,j);
                d[shu].dx = i;
                d[shu].dy = j;
                d[shu].dwei = ll;
                //cout<<ll<<endl;
                //cout<<i<<' '<<j<<endl;
                int aa = s[i][j] - '0';
                d[shu].dshu = aa;
                //cout<<d[shu].dwei<<endl;
                shu++;
            }
        }
    }
    sort(d,d+shu,cmp);
    int i = 0;
    int sum = 0;
    while(i < shu&&d[i].dwei <= swei)
    {
        sum += d[i].dshu;
        i++;
    }
    printf("%d\n",sum);
    return 0;
}

抱歉!评论已关闭.