雜題 翻硬幣

2021-08-09 09:29:08 字數 1242 閱讀 4126

問題 a: 翻硬幣

時間限制: 1 sec 記憶體限制: 128 mb

題目描述

有乙個n行n列的棋盤,每個格仔上都有乙個硬幣,且n為偶數。每個硬幣要麼是正面朝上,要麼是反面朝上。每次操作你可以選定乙個格仔(x,y),然後將第x行和第y列的所有硬幣都翻面。求將所有硬幣都變成同乙個面最少需要的運算元。

輸入 第一行包含乙個正整數n。

接下來n行,每行包含乙個長度為n的01字串,表示棋盤上硬幣的狀態。

輸出 僅包含一行,為最少需要的運算元。

樣例輸入

4 0101

1000

0010

0101

樣例輸出

2 提示

【樣例說明】

對(2,3)和(3,1)進行操作,最後全變成1。

【資料規模】

對於100%的資料,n ≤ 1,000。

第一反應是高斯消元解異或方程組。然後看到了資料範圍。。。(1000^2)^3的時間效率。qaq

仔細想想,設a[i][j]是(i,j)的初始狀態,h[i][j]為是否操作,並且設最後全變成0.那乙個點最後是否要操作,取決於和他同一行同一列所有點是否要操作。h[i][j]=h[i][sigma]^h[sigma][j]^a[i][j]。其實雖然其他的h並不知道,但是我們考慮把它們都帶進去,然後就搞出來了一大堆同一行同一列。。。然後,它們互相抵消了。就剩下了,同一行一列的初狀態的異或和^a[i][j],o(n^2)

統計出讓其全變成0的步數,如果最優是全變成1,那麼所有的點是否操作就變得完全相反了。那就和n^2-ans取個min就行了。

#include 

#include

#include

#include

#include

#define n 1005

using

namespace

std;

char s[n];int n,a[n][n],h[n],z[n],ans;

int main()

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++)

h[i]^=a[i][j],z[j]^=a[i][j];

for(int i=1;i<=n;i++)

for(int j=1;j<=n;j++)

printf("%d\n",min(n*n-ans,ans));

}

每日一題 翻硬幣

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

翻硬幣問題

翻硬幣問題 翻硬幣問題有好幾種。其中的一種是這樣的 桌子上有q m n枚硬幣,m正面朝上,n枚反面朝上,每一輪翻p枚,在每一輪翻幣的時候,被翻的同一枚硬幣只能翻一次。問最少多少次能把所有的硬幣翻成全部正面或者反面朝上?根據問題的描述,問題實際上隱含 m n p 0,m n p。這個問題往往是計算機程...

翻硬幣(貪心)

歷屆試題 翻硬幣 時間限制 1.0s 記憶體限制 256.0mb 問題描述 小明正在玩乙個 翻硬幣 的遊戲。桌上放著排成一排的若干硬幣。我們用 表示正面,用 o 表示反面 是小寫字母,不是零 比如,可能情形是 oo oooo 如果同時翻轉左邊的兩個硬幣,則變為 oooo oooo 現在小明的問題是 ...