棋盘:(状压dp)

传送门:https://www.cometoj.com/contest/38/problem/B?problem_id=1535

题目描述

小猫有一个 2×N 的棋盘,每一个格子放着一个黑棋子或白棋子。

小熊觉得小猫的棋盘不够好看,想要把棋盘上的一部分白棋子替换成黑棋子,使得所有黑棋子都能够在仅允许上下左右四个方向走,且仅经过黑棋子在的格子的情况下两两互相到达。

小熊想知道至少要将多少个白棋子替换成黑棋子。

注意:不能将黑棋子替换成白棋子。

输入描述

第一行有一个正整数 N (1≤N≤105)。

接下来两行,每行 N个整数,描述整个棋盘。若第 i 行的第 j个整数是 0,代表棋盘 (i,j) 的位置放着白棋子,若是 1 则放着黑棋子。

数据保证至少存在一个黑棋子。

输出描述

输出一行包含一个整数,表示答案。

样例输入 1

3
1 0 0
0 0 1

样例输出 1

2

样例输入 2

5
0 1 0 1 0
0 0 1 0 0

样例输出 2

1

提示


样例一中可以将第一行的两个白棋子替换成黑棋子。

样例二中可以将位置 (1, 3)(1,3) 的白棋子换成黑棋子。

 
大佬分析:(自己完全没想到QAQ)
 题⽬意思就是说通过把0 变成1 来将所有 变成⼀个联通块,要求最少的变换个数。我是⽤的暴⼒模拟,从第⼀列
开始遍历每⼀列,因为只有两⾏,含1的每⼀列⽆⾮就是:上 1下 1,上0 下 1,上1 下0 ;只有这三种情况是需要变
化前⾯列的 来使 联通的,观察这三种情况,上1 下1 时,变换个数就是上⼀次有 的列号与当前列号差值的绝对
值 (直接由上⼀个有 的位置沿着⾏直线变化到当前列);上 1下0 时,就需要看上⼀次有1 的那⼀列的1 的情况
了,如果上⼀次有 1处和当前列有1 处是同⼀⾏,说明可以直线变换过来,变换个数就是上⼀次有 1的列号与当前
列号差值的绝对值-1 ,如果不是同⼀⾏,则需要多加 1(需要多变换⼀个棋⼦);上 下 的情况和上⼀种情况类
似解法。因此关键就是保存上⼀次有 1处的那列情况,在遇到某列有 时考虑上⾯的情况然后累加就⾏了。
 
AC代码:
 /* */
# include <stdio.h>
int main()
{
long long int map[][]={}, n, i, j, sum=;
scanf("%lld", &n);
for( i=; i<; i++ )
{
for( j=; j<n; j++ )
{
scanf("%lld", &map[i][j]);
}
}
int nowone = ;
int nowtwo = ;
int flag=;
int f;
int pre;
for( j=; j<n; j++ )
{
nowone=;
nowtwo=;
if( map[][j] )
{
nowone = ;
}
if( map[][j] )
{
nowtwo = ;
}
if( nowone || nowtwo )
{
if( flag== )
{
f = j;
if( nowone )///上1下0
{
pre = ;
}
if( nowtwo )///上0下1
{
pre = ;
}
if( nowone && nowtwo )///上1下1
{
pre = ;
}
flag = ;
}
else
{
if( nowone && nowtwo )
{
sum += j - f - ;
pre = ;
}
if( nowone && !nowtwo )///上1下0
{
sum += j-f-;
if( pre== )///上0下1
{
sum++;
pre = ;///前方不连通则变为联通,此时这一列的状态变为上1下1
}
else
{
pre = ;///前方已经联通,这一列的状态不变
}
}
if( !nowone && nowtwo )///上0下1
{
sum += j - f - ;
if( pre== )///上1下0
{
sum++;
pre = ;///前方不连通则变为联通,此时这一列的状态变为上1下1
}
else
{
pre=;///前方已经联通,这一列的状态不变
}
}
f = j;
}
}
}
printf("%lld\n", sum);
return ;
}
 
 

cometoj---contest#3 棋盘的更多相关文章

  1. [Cometoj#3 B]棋盘_状压dp

    棋盘 题目链接:https://cometoj.com/contest/38/problem/B?problem_id=1535 数据范围:略. 题解: 因为行数特别小,所以$dp$的时候可以状压起来 ...

  2. CometOJ Contest #3 C

    题目链接:https://cometoj.com/contest/38/problem/C?problem_id=1542&myself=0&result=0&page=1&a ...

  3. 【杂题】【CometOJ Contest #5】E:迫真大游戏【概率】【排列组合】【多项式】

    Description 有一个n个点的环,有一个指针会从1号点开始向后扫描,每次扫描有p的概率删除当前点 询问每个点最后一个被删除的概率. 答案对998244353取模 n<=200000 So ...

  4. 「CometOJ」Contest #11

    Link Aeon 显然字典序最大就是把最小的字母放在最后 Business [动态规划] 简单dp dp[i][j]dp[i][j]dp[i][j]表示到第iii天,当前有jjj块钱,最后返还的钱最 ...

  5. Comet OJ - Contest #3 B -棋盘 (思维+分类讨论)

    题目描述 小猫有一个 2\times N2×N 的棋盘,每一个格子放着一个黑棋子或白棋子. 小熊觉得小猫的棋盘不够好看,想要把棋盘上的一部分白棋子替换成黑棋子,使得所有黑棋子都能够在仅允许上下左右四个 ...

  6. 【CometOJ】Comet OJ - Contest #8 解题报告

    点此进入比赛 \(A\):杀手皇后(点此看题面) 大致题意: 求字典序最小的字符串. 一场比赛总有送分题... #include<bits/stdc++.h> #define Tp tem ...

  7. 2016 Multi-University Training Contest 3

    5/11 2016 Multi-University Training Contest 3官方题解 2016年多校训练第三场 老年选手历险记 暴力 A Sqrt Bo(CYD) 题意:问进行多少次开根 ...

  8. [contest 782] 9.7

    [contest 782] 9.7 - XJOI 个人觉得温暖题啊,,,可是卡毛空间呀!!! T1 传送

  9. Comet OJ - Contest #2 简要题解

    Comet OJ - Contest #2 简要题解 cometoj A 模拟,复杂度是对数级的. code B 易知\(p\in[l,r]\),且最终的利润关于\(p\)的表达式为\(\frac{( ...

随机推荐

  1. springboot笔记07——整合MyBatis

    前言 Springboot 整合 MyBatis 有两种方式,分别是:"全注解版" 和 "注解.xml混合版". 创建项目 创建Springboot项目,选择依 ...

  2. CSS是什么

    css是层叠样式表(英文全称:Cascading Style Sheets)是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一个子集)等文件样式的计算机语言. CSS不 ...

  3. O - Can you find it?(二分查找)

    O - Can you find it? Time Limit:3000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64 ...

  4. SpringMVC框架笔记01_SpringMVC的使用案例和架构组件_SpringMVC和Mybatis整合_接收参数

    目录 第1章:SpringMVC简介 1.1 什么是SpringMVC 1.2 SpringMVC的处理流程 第2章:SpringMVC入门程序 2.1 场景描述 2.2 步骤分析 2.3 步骤一:创 ...

  5. docker入门一:docker安装(在线跟离线)

    一.在线安装 1.安装依赖 yum install -y yum-utils device-mapper-persistent-data lvm2 2.添加软件源 yum-config-manager ...

  6. Centos部署项目

    nginx + virtualenv + uwsgi + django + mysql + supervisor 部署项目 一.安装Python3 二.安装MariaDB,并授权远程 grant al ...

  7. 【HICP Gauss】数据库 环境的搭建 -1

    1.安装规则    1.主机名必须网络唯一  2.主机名必须两位数以上 可以中划线 不能下划线  3.固定IP地址  4.端口号 1888 新增账户 omm 用户组 dbgrp ,家目录 /home/ ...

  8. [software test - 001] Why we need software test?

    /*  This is a conclusion about the software testing job. */ /*  Scope: middle level software tasks,  ...

  9. MongoDB导出与导入远程Linux服务器上的数据

    场景 将远程服务器A上的MongoDB数据库test下的集合people导入到服务器B数据库test的集合people_test下. 简单方案 先将A服务器数据导出,然后再执行导入到B服务器. 下面的 ...

  10. C#使用托管程序连接Oracle数据库(Oracle.ManagedDataAccess.dll)

    一.概述 Oracle Data Provider for  .NET, Managed Driver: Oracle官方的托管数据库访问组件,单DLL,Oracle.ManagedDataAcces ...