Bzoj3517 翻硬幣題解 解異或方程組

2022-05-10 05:42:09 字數 1476 閱讀 7266

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 9

#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 }

view code

雜題 翻硬幣

問題 a 翻硬幣 時間限制 1 sec 記憶體限制 128 mb 題目描述 有乙個n行n列的棋盤,每個格仔上都有乙個硬幣,且n為偶數。每個硬幣要麼是正面朝上,要麼是反面朝上。每次操作你可以選定乙個格仔 x,y 然後將第x行和第y列的所有硬幣都翻面。求將所有硬幣都變成同乙個面最少需要的運算元。輸入 第...

每日一題 翻硬幣

翻硬幣 小明正在玩乙個 翻硬幣 的遊戲。桌上放著排成一排的若干硬幣。我們用 表示正面,用o表示反面 是小寫字母,不是零 比如,可能情形是 oo oooo 如果同時翻轉左邊的兩個硬幣,則變為 oooo oooo 現在小明的問題是 如果已知了初始狀態和要達到的目標狀態,每次只能同時翻轉相鄰的兩個硬幣,那...

藍橋杯歷屆真題 翻硬幣

原題 小明正在玩乙個 翻硬幣 的遊戲。桌上放著排成一排的若干硬幣。我們用 表示正面,用 o 表示反面 是小寫字母,不是零 比如,可能情形是 oo oooo 如果同時翻轉左邊的兩個硬幣,則變為 oooo oooo 現在小明的問題是 如果已知了初始狀態和要達到的目標狀態,每次只能同時翻轉相鄰的兩個硬幣,...