原文链接https://www.cnblogs.com/zhouzhendong/p/CF1098B.html

题解

  首先,我们来证明一个结论:

  合法的矩阵要么满足每列只有两种字符,要么满足每行只有两种字符。

  然后直接枚举就好了。

  代码并不是那么好写。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL read(){
LL x=0;
char ch=getchar();
while (!isdigit(ch))
ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x;
}
const int N=300005;
const LL INF=1LL<<60;
int n,m;
char ch[4]={'A','C','G','T'};
int v[300],a[N],b[N],t[N],ans;
char s[N];
int &A(int i,int j){
return a[(i-1)*m+j];
}
int &B(int i,int j){
return b[(i-1)*m+j];
}
int &T(int i,int j){
return t[(i-1)*m+j];
}
int get(int c,int v1,int v2){
int c1=0,c2=0;
for (int i=1;i<=n;i++){
if (i&1){
c1+=A(i,c)!=v1;
c2+=A(i,c)!=v2;
}
else {
c1+=A(i,c)!=v2;
c2+=A(i,c)!=v1;
}
}
if (c1<=c2){
for (int i=1;i<=n;i++)
if (i&1)
T(i,c)=v1;
else
T(i,c)=v2;
return c1;
}
else {
for (int i=1;i<=n;i++)
if (i&1)
T(i,c)=v2;
else
T(i,c)=v1;
return c2;
}
}
int get2(int c,int v1,int v2){
int c1=0,c2=0;
for (int i=1;i<=m;i++){
if (i&1){
c1+=A(c,i)!=v1;
c2+=A(c,i)!=v2;
}
else {
c1+=A(c,i)!=v2;
c2+=A(c,i)!=v1;
}
}
if (c1<=c2){
for (int i=1;i<=m;i++)
if (i&1)
T(c,i)=v1;
else
T(c,i)=v2;
return c1;
}
else {
for (int i=1;i<=m;i++)
if (i&1)
T(c,i)=v2;
else
T(c,i)=v1;
return c2;
}
}
int main(){
v['A']=0,v['C']=1,v['G']=2,v['T']=3;
n=read(),m=read();
for (int i=1;i<=n;i++){
scanf("%s",s+1);
for (int j=1;j<=m;j++)
A(i,j)=v[s[j]];
}
ans=n*m;
for (int i=0;i<4;i++)
for (int j=i+1;j<4;j++){
int now=0;
int ii=-1,jj;
for (int k=0;k<4;k++)
if (k!=i&&k!=j)
if (!~ii)
ii=k;
else
jj=k;
for (int k=1;k<=m;k++)
if (k&1)
now+=get(k,i,j);
else
now+=get(k,ii,jj);
if (now<ans){
ans=now;
for (int i=1;i<=n*m;i++)
b[i]=t[i];
}
}
for (int i=0;i<4;i++)
for (int j=i+1;j<4;j++){
int now=0;
int ii=-1,jj;
for (int k=0;k<4;k++)
if (k!=i&&k!=j)
if (!~ii)
ii=k;
else
jj=k;
for (int k=1;k<=n;k++)
if (k&1)
now+=get2(k,i,j);
else
now+=get2(k,ii,jj);
if (now<ans){
ans=now;
for (int i=1;i<=n*m;i++)
b[i]=t[i];
}
}
for (int i=1;i<=n;i++,puts(""))
for (int j=1;j<=m;j++)
putchar(ch[B(i,j)]);
return 0;
}

  

Codeforces 1098B. Nice table 构造的更多相关文章

  1. Codeforces.226D.The table(构造)

    题目链接 \(Description\) 给定一个\(n\times m\)的矩阵\(A_{i,j}\),每次可以将一列或一行取负.求一个方案使得若干次操作后,每行每列的和都非负. \(n,m\leq ...

  2. Codeforces 417E Square Table(随机算法)

    题目链接:Codeforces 417E Square Table 题目大意:给出n和m.要求给出一个矩阵,要求每一列每一行的元素的平方总和是一个平方数. 解题思路:构造.依照 a a a b a a ...

  3. Codeforces Round #140 (Div. 1) D. The table 构造

    D. The table 题目连接: http://www.codeforces.com/contest/226/problem/D Description Harry Potter has a di ...

  4. CodeForces 1099E - Nice table - [好题]

    题目链接:https://codeforces.com/problemset/problem/1099/E You are given an $n×m$ table, consisting of ch ...

  5. Lua中的table构造式(table constructor)

    最简单的构造式就是一个空构造式{},用于创建一个空table. 构造式还可以用于初始化数组.例如,以下语句:days = {"Sunday", "Monday" ...

  6. Codeforces 1383D - Rearrange(构造)

    Codeforces 题面传送门 & 洛谷题面传送门 一道不算困难的构造,花了一节英语课把它搞出来了,题解简单写写吧( 考虑从大往小加数,显然第三个条件可以被翻译为,每次加入一个元素,如果它所 ...

  7. Codeforces 549B. Looksery Party[构造]

    B. Looksery Party time limit per test 1 second memory limit per test 256 megabytes input standard in ...

  8. codeforces 582A. GCD Table 解题报告

    题目链接:http://codeforces.com/problemset/problem/582/A 网上很多题解,就不说了,直接贴代码= = 官方题解: http://codeforces.com ...

  9. codeforces 323A. Black-and-White Cube 构造

    输入n 1 <= n <= 100 有一个n * n * n 的立方体,由n ^ 3 个1 * 1 * 1 的单位立方体构成 要用white 和 black 2种颜色来染这n ^ 3个立方 ...

随机推荐

  1. 安装mysql8.0出现服务无法启动,服务没报告任何错误

    改为net start mysql80 参考https://blog.csdn.net/gzejia/article/details/82156994

  2. Docker 删除容器日志

    在使用docker的时候,我们经常通过 docker logs -f containername或者id 但是有时候日志很多.很麻烦.所以需要清理一下对应container的日志. 默认情况下,dao ...

  3. 爬虫 BeatifulSoup 模块

    BeatifulSoup 模块 介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库 安装 pip install beautifulsoup4  解析器下载 ...

  4. HDOJ5543 Pick The Sticks

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5543 题目大意:有n个金条,每个金条有长度和价值,给一个长度为L的容器,当金条在容器两端的时候,只要重 ...

  5. 这可能是最为详细的Docker入门吐血总结

    这可能是最为详细的Docker入门吐血总结  https://www.cnblogs.com/ECJTUACM-873284962/p/9789130.html Docker是什么? 在计算机技术日新 ...

  6. (转)Java8内存模型—永久代(PermGen)和元空间(Metaspace)

    背景:介绍java8中永久代到元空间的转变. Java8内存模型—永久代(PermGen)和元空间(Metaspace) 一.JVM 内存模型 根据 JVM 规范,JVM 内存共分为虚拟机栈.堆.方法 ...

  7. IDEA 破解

    推荐三篇文章  : 1:    https://blog.csdn.net/nishiwodebocai21/article/details/71359619?fps=1&locationNu ...

  8. python 学习地址

    本章主要记录学习python过程中借鉴的一些网站,并感谢这些博主辛勤付出. python官网:https://www.python.org/ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...

  9. ArrayList的实现及原理

    ArrayList ArrayList是最常见以及每个Java开发者最熟悉的集合类了,顾名思义,ArrayList就是一个以数组形式实现的集合,以一张表格来看一下ArrayList里面有哪些基本的元素 ...

  10. 重置sqlserver自增长列的种子

    重置sqlserver自增长列的种子 转自:http://hi.baidu.com/zbphot/item/41c55982c2d02dd05e0ec184 如果表中的数据不要了,用下面的语句:  t ...