题目大意是:输入n,m,给出n*m(n,m<=100)的不是正规的布满棋子的棋盘,求最少改几个棋子可以使得棋盘正规,正规的棋盘必须是每个相邻的棋子颜色都不同(只有黑白两种,用0,1代替)
比如2*2
00
00
最少需要换2个棋子
10
01最少换0个棋子
3*3
111
111
111
最少换四个棋子
这题我一点思路都没有,全场已经很多人做出来了,我感觉这题应该是很难的贪心才对,怎么田大神7分钟就做出来了。。。想啊想。。。一直到比赛结束都没很好的思路。。。。全场很多人都作出这题目了,赛后问帆哥,点播了一下,瞬时间感觉自己智商已经是集训队里面最低的了,完全被碾压。。。自上次区域赛回来以后一蹶不振,状态一直处于低谷,各种比赛被碾压,在队里被队友压,在外面被外面强队压,我艹艹艹。。。。。好痛苦啊。。。。。。。。。。。怎么感觉这一年白学了一样。。。。。。别人都在变强,我怎么越来越弱啊。。。草泥马啊,。。哎。。。。不过痛苦归痛苦,不管怎么说吧,即使觉得自己笨,这不会,那也不会,各种被虐,回头擦干眼泪,还是要低头默默A题————这就是我的忍道(2333333)
废话少说,说下这题的正确思路吧:n×m的正规的棋盘,永远只有两种正确的摆放,就是开始是0或者开始是1,然后我们拿给出的不正规的棋盘每个棋子都和这两个正确的棋盘比较,比较两个总共不同的取其中最小的
还有注意打出01棋盘的时候巧妙的方法:i+j为奇数为0或者为1
为什么我就想不到呢?果然还是智商不行。。。QAQ。。。多多A题,提高智商(23333)
#include <iostream> #include <cstring> #include <cstdio> using namespace std; int b[150][150]; int a[150][150]; int c[150][150]; int main() { #ifdef xxz freopen("in.txt","r",stdin); #endif // xxz int n,m; while(cin>>n>>m) { for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) cin>>a[i][j]; int ans , num_c, num_b; num_c = num_b = 0; for(int i = 0; i < n ; i++) { for(int j = 0; j < m; j++) { if((i+j)%2 == 1) { b[i][j] = 1; c[i][j] = 0; if(a[i][j] != b[i][j]) num_b++; if(a[i][j] != c[i][j]) num_c++; } else { b[i][j] = 0; c[i][j] = 1; if(a[i][j] != b[i][j]) num_b++; if(a[i][j] != c[i][j]) num_c++; } } } cout<<min(num_b,num_c)<<endl; } return 0; }
时间: 2024-10-04 00:50:22