time limit: 1 sec memory limit: 128 mb
submit: 281 solved: 211
[submit][status][discuss]
有乙個n行n列的棋盤,每個格仔上都有乙個硬幣,且n為偶數。每個硬幣要麼是正面朝上,要麼是反面朝上。每次操作你可以選定乙個格仔(x,y),然後將第x行和第y列的所有硬幣都翻面。求將所有硬幣都變成同乙個面最少需要的運算元。
第一行包含乙個正整數n。
接下來n行,每行包含乙個長度為n的01字串,表示棋盤上硬幣的狀態。
僅包含一行,為最少需要的運算元。
40101
1000
0010
0101
2【樣例說明】
對(2,3)和(3,1)進行操作,最後全變成1。
【資料規模】
對於100%的資料,n ≤ 1,000。
上來一看,第一反應,異或數學題,想了半天如何異或也沒想出來,問呵呵酵母菌,他說他覺得是圖論wtf?!圖論有幾個o(n)演算法能在這道題用上的。
於是乎看了一眼題解:解異或方程組……
乙個點最多翻一遍,這話不用再說了吧……
讓我們先從都翻為0開始說起
我們設x[i][j]為第i,j個點是否要翻,a[i][j]為該點初始狀態,則x[1][j]^x[2][j]^……^x[n][j]^x[i][1]^x[i][2]^x[i][m]^x[i][j]=a[i][j]。
我們把第i行和第j列所有的點按照上式列出方程組並合併, 由於n為偶數,則可以化為:
x[i][j]=a[1][j]^a[2][j]^……^a[n][j]^a[i][1]^a[i][2]^……^a[i][m]^a[i][j]。
那麼我們只要對於每一行,每一列n^2預處理出他們的異或和再相加就好了。
至於都為1嗎?由於n是偶數,我們只要把每乙個點是否翻的狀態取反就是答案。
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9view code#define n 1005
10using
namespace
std;
11int
n,a[n][n];
12char
b[n];
13int sum[2
][n];
14int
main()
1524}25
for(int i=1;i<=n;i++)
2632}33
int ans=0;34
for(int i=1;i<=n;i++)
3542
}43 ans=min(ans,n*n-ans);
44 printf("
%d\n
",ans);
45return0;
46 }
雜題 翻硬幣
問題 a 翻硬幣 時間限制 1 sec 記憶體限制 128 mb 題目描述 有乙個n行n列的棋盤,每個格仔上都有乙個硬幣,且n為偶數。每個硬幣要麼是正面朝上,要麼是反面朝上。每次操作你可以選定乙個格仔 x,y 然後將第x行和第y列的所有硬幣都翻面。求將所有硬幣都變成同乙個面最少需要的運算元。輸入 第...
每日一題 翻硬幣
翻硬幣 小明正在玩乙個 翻硬幣 的遊戲。桌上放著排成一排的若干硬幣。我們用 表示正面,用o表示反面 是小寫字母,不是零 比如,可能情形是 oo oooo 如果同時翻轉左邊的兩個硬幣,則變為 oooo oooo 現在小明的問題是 如果已知了初始狀態和要達到的目標狀態,每次只能同時翻轉相鄰的兩個硬幣,那...
藍橋杯歷屆真題 翻硬幣
原題 小明正在玩乙個 翻硬幣 的遊戲。桌上放著排成一排的若干硬幣。我們用 表示正面,用 o 表示反面 是小寫字母,不是零 比如,可能情形是 oo oooo 如果同時翻轉左邊的兩個硬幣,則變為 oooo oooo 現在小明的問題是 如果已知了初始狀態和要達到的目標狀態,每次只能同時翻轉相鄰的兩個硬幣,...