codeforces 1099E-Nice table
Posted forever-666
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了codeforces 1099E-Nice table相关的知识,希望对你有一定的参考价值。
传送门:QAQQAQ
题意:给你一个矩阵只有AGCT,若对于每一个2*2的子矩阵中的四个字母互不相同,则称为这个矩阵是nice的,问至少变矩阵中的几个点可以使矩阵变nice
思路:没什么思路……就是大模拟。
我们先糊出一个结论:对于一个nice矩阵,要么每一行是两个字母循环出现,要么是每一列两个字母循环出现。(所以对于一些无从下手的题可以先模拟几个数据找普遍规律)
所以我们可以枚举左上角的2*2矩阵,再分类是关于行重复还是关于列重复,再关于每一个重复的行或列分类是ABABAB还是BABABA,然后爆搜答案和ans比较,用tmp维护再分类时的矩阵,用tmp来更新ans矩阵
代码量过大,本人在写程序时遇到以下问题:
1.更新时best矩阵忘清零
2.string直接赋值,而没有push_noback
3.智障地把ans=now写成了now=ans
代码(长度要破纪录了):
#include<iostream> #include<cstdio> #include<algorithm> #include<string> #include<cstring> #include<vector> using namespace std; int n,m; string s[400005],best[400005]; vector<int> a[400005],tmp[400005]; int t[30][5],top=0,ans=4000000; int fn(char c) if(c==‘A‘) return 1; else if(c==‘C‘) return 2; else if(c==‘G‘) return 3; else if(c==‘T‘) return 4; char fc(int c) if(c==1) return ‘A‘; else if(c==2) return ‘C‘; else if(c==3) return ‘G‘; else if(c==4) return ‘T‘; void print() cout<<"That‘s OK!"<<endl; int main() //freopen("Nice.in","r",stdin); //freopen("Nice.out","w",stdout); ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); scanf("%d%d",&n,&m); for (int i=0;i<n;++i) cin>>s[i]; for(int j=0;j<m;j++) a[i].push_back(fn(s[i][j])); for(int c1=1;c1<=4;c1++) for(int c2=1;c2<=4;c2++) for(int c3=1;c3<=4;c3++) int c4=10-c1-c2-c3; if(c1==c2||c2==c3||c1==c3) continue; t[++top][1]=c1; t[top][2]=c2; t[top][3]=c3; t[top][4]=c4; for(int tt=1;tt<=24;tt++) int c1=t[tt][1],c2=t[tt][2],c3=t[tt][3],c4=t[tt][4]; for(int b=0;b<=1;b++) //0:heng 1:shu int now=0; if(!b) for(int i=0;i<n;i++) tmp[i].clear(); for(int i=0;i<n;i++) if(i%2==0) if(i==0) for(int j=0;j<m;j++) if(j%2==0) if(c1!=a[i][j]) now++; tmp[i].push_back(c1); if(j%2==1) if(c2!=a[i][j]) now++; tmp[i].push_back(c2); else int tmp1=0,tmp2=0; for(int j=0;j<m;j++) if(j%2==0) if(c1!=a[i][j]) tmp1++; if(c2!=a[i][j]) tmp2++; else if(c1!=a[i][j]) tmp2++; if(c2!=a[i][j]) tmp1++; if(tmp1<=tmp2) now+=tmp1; for(int j=0;j<m;j++) if(j%2==0) tmp[i].push_back(c1); else tmp[i].push_back(c2); else now+=tmp2; for(int j=0;j<m;j++) if(j%2==0) tmp[i].push_back(c2); else tmp[i].push_back(c1); else if(i==1) for(int j=0;j<m;j++) if(j%2==0) if(c3!=a[i][j]) now++; tmp[i].push_back(c3); if(j%2==1) if(c4!=a[i][j]) now++; tmp[i].push_back(c4); else int tmp1=0,tmp2=0; for(int j=0;j<m;j++) if(j%2==0) if(c3!=a[i][j]) tmp1++; if(c4!=a[i][j]) tmp2++; else if(c3!=a[i][j]) tmp2++; if(c4!=a[i][j]) tmp1++; if(tmp1<=tmp2) now+=tmp1; for(int j=0;j<m;j++) if(j%2==0) tmp[i].push_back(c3); else tmp[i].push_back(c4); else now+=tmp2; for(int j=0;j<m;j++) if(j%2==0) tmp[i].push_back(c4); else tmp[i].push_back(c3); if(now<ans) ans=now; for(int i=0;i<n;i++) best[i].clear();//!!!!! for(int i=0;i<n;i++) for(int j=0;j<m;j++) best[i].push_back(fc(tmp[i][j])); //string不要直接赋值!!! else for(int j=0;j<m;j++) tmp[j].clear(); for(int j=0;j<m;j++) if(j%2==0) if(j==0) for(int i=0;i<n;i++) if(i%2==0) if(c1!=a[i][j]) now++; tmp[j].push_back(c1); if(i%2==1) if(c3!=a[i][j]) now++; tmp[j].push_back(c3); else int tmp1=0,tmp2=0; for(int i=0;i<n;i++) if(i%2==0) if(c1!=a[i][j]) tmp1++; if(c3!=a[i][j]) tmp2++; else if(c1!=a[i][j]) tmp2++; if(c3!=a[i][j]) tmp1++; if(tmp1<=tmp2) now+=tmp1; for(int i=0;i<n;i++) if(i%2==0) tmp[j].push_back(c1); else tmp[j].push_back(c3); else now+=tmp2; for(int i=0;i<n;i++) if(i%2==0) tmp[j].push_back(c3); else tmp[j].push_back(c1); else if(j==1) for(int i=0;i<n;i++) if(i%2==0) if(c2!=a[i][j]) now++; tmp[j].push_back(c2); if(i%2==1) if(c4!=a[i][j]) now++; tmp[j].push_back(c4); else int tmp1=0,tmp2=0; for(int i=0;i<n;i++) if(i%2==0) if(c2!=a[i][j]) tmp1++; if(c4!=a[i][j]) tmp2++; else if(c2!=a[i][j]) tmp2++; if(c4!=a[i][j]) tmp1++; if(tmp1<=tmp2) now+=tmp1; for(int i=0;i<n;i++) if(i%2==0) tmp[j].push_back(c2); else tmp[j].push_back(c4); else now+=tmp2; for(int i=0;i<n;i++) if(i%2==0) tmp[j].push_back(c4); else tmp[j].push_back(c2); if(now<ans) ans=now;//ans,now写反了。。。 for(int i=0;i<n;i++) best[i].clear();//!!!!! for(int i=0;i<n;i++) for(int j=0;j<m;j++) best[i].push_back(fc(tmp[j][i])); for(int i=0;i<n;i++) for(int j=0;j<m;j++) printf("%c",best[i][j]); puts(""); return 0;
以上是关于codeforces 1099E-Nice table的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces 1099 B. Squares and Segments-思维(Codeforces Round #530 (Div. 2))
Codeforces 1099 D. Sum in the tree-构造最小点权和有根树 贪心+DFS(Codeforces Round #530 (Div. 2))
Codeforces1099F. Cookies(线段树+dp+贪心+博弈)
Codeforces1099F. CookiesDP线段树贪心博弈沙比提(这是啥算法)