Codeforces Round #192 (Div. 2)

据说这是水题~~三点二十做到四点四十水了三个题,后面的题目真长!

A。Cakeministor

一个N*M的蛋糕,里面有几个毒草莓,现在这个人一下可以吃一行或者一列,但是不能吃到毒草莓,问最多可以吃掉多少格子的蛋糕。

只要算出有多少行和列是没有毒草莓的,若分别为A,B,那么答案就是A*M+B*N-A*B。


B。Road Construction

有N个城市,彼此之间都没有道路,现在要求每两个城市之间最多只能有两条边,然后给定一些城市对之间不能直接连边,输出修路的方案。

以为不能直接连边的城市对小于城市数的二分之一,所以一定会有某一个城市和其他任意城市都能连边。那么只要把其他城市和他连起来就可以了。

 

C。Purification

一个N*N的矩阵,由‘ E ’和‘ . ’组成,每次贴一张符,可以净化掉同一行和同一列的格子,但是符只能贴在‘ . ’上,问符要贴在哪里~~

显然要贴N张符,即,每一行都有一个点或者每一列都有一个点~~否则就输出-1.所以只要判断是何种情况然后每一行或者每一列输出一个点就可以了~~

本来想用dfs写的,想想直接做就好叻~~

#include<iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;
struct node
{
    int x,y;
}row[10010],col[10010];
int n,lbr[110],lbc[110];
char map[110][110];
int main()
{
    int i,j,k,cntr=0,cntc=0,flag=1,cnt;
    scanf("%d",&n);
    for (i=0;i<n;i++)
        scanf("%s",map[i]);
    for (i=0;i<n;i++)
    {
        for (j=0;j<n;j++)
            if (map[i][j]=='.')
                row[cntr].x=i,row[cntr++].y=j;
        lbr[i+1]=cntr;
        if (lbr[i+1]==lbr[i]){flag=0;break;}
    }
    if (flag==0){
    flag=2;
    for (i=0;i<n;i++)
    {
        for (j=0;j<n;j++)
            if (map[j][i]=='.')
                col[cntc].x=j,col[cntc++].y=i;
        lbc[i+1]=cntc;
        if (lbc[i+1]==lbc[i]){flag=0;break;}
    }}
    if (flag==0) printf("-1\n");
    else
    {
        if (flag==1)
        {
            cnt=1;
            printf("%d %d\n",row[0].x+1,row[0].y+1);
            for (i=1;i<cntr;i++)
            {
                if (row[i].x!=row[i-1].x) printf("%d %d\n",row[i].x+1,row[i].y+1),cnt++;
                if (cnt==n) break;
            }
        }
        else
        {
            cnt=1;
            printf("%d %d\n",col[0].x+1,col[0].y+1);
            for (i=1;i<cntc;i++)
            {
                if (col[i].y!=col[i-1].y) printf("%d %d\n",col[i].x+1,col[i].y+1),cnt++;
                if (cnt==n) break;
            }
        }
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值