首页 > 代码库 > Codeforces Rounds #254 div2:A,B,C

Codeforces Rounds #254 div2:A,B,C

A:

这是一道红果果的水题啊。。。。好坑爹。。。暴力一直不过。。。。WA了4遍呐。。。。。。时间过了1个小时后,打算用dfs写。。。浪费了好多脑细胞。。。大神2分钟就过了。。。我还要1个多小时才过。。。我还是太弱了。。。我是白痴。。。5555。。。今天一早知道了学姐的做法,奇行奇列和偶行偶列用B,其他的用W。。。。要是能想到果然很水。。。。哭晕在厕所惹。。。接下来俩种代码都贴一下吧。。。

//dfs
#include <stdio.h>
int n,m;
char a[105][105];
int limit(int x,int y)
{
    if(x>=0&&x<n&&y>=0&&y<m&&a[x][y]=='.')
        return 1;
    return 0;
}
void dfs(int x,int y)
{
    if(limit(x-1,y))
    {
        if(a[x][y]=='B')
            a[x-1][y]='W';
        else a[x-1][y]='B';
        dfs(x-1,y);
    }
    if(limit(x+1,y))
    {
        if(a[x][y]=='B')
            a[x+1][y]='W';
        else a[x+1][y]='B';
        dfs(x+1,y);
    }
    if(limit(x,y-1))
    {
        if(a[x][y]=='B')
            a[x][y-1]='W';
        else a[x][y-1]='B';
        dfs(x,y-1);
    }
    if(limit(x,y+1))
    {
        if(a[x][y]=='B')
            a[x][y+1]='W';
        else a[x][y+1]='B';
        dfs(x,y+1);
    }
}
int main()
{
    int i,j, ff;
    while(~scanf("%d%d%*c",&n,&m))
    {
        for(i=0;i<n;i++)
           gets(a[i]);
        for(i=0;i<n; i++)
            for(j=0;j<m; j++)
                if(a[i][j]=='.')
                {
                    a[i][j]='B';
                    dfs(i,j);
                }
        for(i=0;i<n;i++)
            puts(a[i]);
    }
    return 0;
}

//水过~~~代码亲测能过da~~
#include <stdio.h>
int main()
{
    int n,m, i,j;
    char a[105][105];
    while(~scanf("%d%d%*c",&n,&m))
    {
        for(i=0;i<n;i++)
           gets(a[i]);
        for(i=0;i<n; i++)
        {
            for(j=0;j<m; j++)
            {
                if(a[i][j]=='.')
                {
                if((i%2&&j%2)||(i%2==0&&j%2==0))
                    printf("B");
                else printf("W");
                }
                else printf("-");
            }
            printf("\n");
        }
    }
    return 0;
}


B:

用并查集做的,先找有几个没有连在一起的,总的减去它,就是有最多种的化学药品能混在一起,再用2的次方就能求出最大危险值。吐舌头这只是我的理解,有什么错误请各位大神斧正~~~以下是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>

int N,M;
int set[1005];
int temp;

int find(int x)
{
	return set[x]=(set[x]==x?x:find(set[x]));
}
void merge(int a,int b)
{
	for(int i=1;i<=N;i++)
	{
		int x=find(a),y=find(b);
		if(x!=y)
		{
			set[x]=y;
			temp--;
		}
	}
}

int main()
{
	while(~scanf("%d%d",&N,&M))
	{
		int a,b;
		temp=N-1;
		for(int j=1;j<=N;j++)
		{
			set[j]=j;
		}
		for(int i=1;i<=M;i++)
		{
			scanf("%d%d",&a,&b);
			merge(a,b);
		}
		printf("%.0lf\n",pow(2,N-temp-1));
	}
	return 0;
}



C:

C题真的要哭晕在厕所惹了啦~~~。。。草鸡大水题。。。。5555.就这么放过了。。。好讨厌啦。。。。。。主要是我英语渣。。。。不想看英语。英语和智商皆是硬伤啊。。。。。。说多了都是水啊。。。55555以下是代码

#include <cstdio>
#define N 517
double MAX(double a, double b)
{
	return a>b?a:b;
}
int main()
{
	int n, m;
	int x[N];
	int a, b, c;
	while(~scanf("%d%d",&n,&m))
	{
		int i, j;
		for(i = 1; i <= n; i++)
		{
			scanf("%d",&x[i]);
		}
		double max = 0, t;
		for(i = 1; i <= m; i++)
		{
			scanf("%d%d%d",&a,&b,&c);
			t =(double) (x[a]+x[b])/c;
			max = MAX(max, t);
		}
		printf("%.15f\n",max);
	}
	return 0;
}