原題:
題意:
n*n的01矩陣,你可以無限次翻轉一行或者一列,可以最多翻轉k(k<=n)次乙個點。問是否可以全部翻轉成0。
解析:
k<=n說明至少有一行不會被翻轉單個點,或者k=n時每行翻轉乙個點。那麼列舉每一行為那一行,將其他行與之對比(可以翻轉後再對比),不同的數量就是需要翻轉單個點的數量。因為有列翻轉,所以全部行都一樣後可以全部變成0。
每一行乙個點的情況也很簡單,第一行列舉每個位置翻轉,判斷其他行是否只翻轉乙個點後與之相同。
不同點的個數用bitset維護。
#include
using
namespace std;
char x[
1002];
bitset<
1002
>b[
1002];
intmain()
}if(k==n)}if
(can)
return0*
printf
("da\n");
} b[1]
.flip
(n);
}int ans=
1e9;
for(
int i=
1;i<=n;i++
) ans=
min(ans,sum);}
if(ans<=k)
printf
("da\n");
else
printf
("ne\n");
}
bitset 優化 01 矩乘
這裡的矩乘並不狹隘地專指一般矩陣乘法,而可以指所有與一般矩乘一樣具有結合律的二元矩陣運算。例 定義一種 01 矩陣乘法 a cdot b c 為下面的 c for int i 1 i n i for int j 1 j n j for int k 1 k n k c i j a i k b k j ...
牛客 簡單瞎搞題 bitset 01dp
牛客 簡單瞎搞題 bitsert 01dp 一共有 n個數,第 i 個數是 xi xi 可以取 li ri 中任意的乙個值。設 s xi2s xi2,求 s 種類數。第一行乙個數 n。然後 n 行,每行兩個數表示 li,ri。輸出一行乙個數表示答案。如果是dp,定義dp i j 第n行,s為j是否有...
C 程式設計例項之翻轉01串
問題描述 給你乙個長度為n的01串。現在想讓你找出最長的01交替子串 子串可以不連續 比如 1010,0101是01交替的串,1101則不是。現在你可以把某乙個連續的區間進行翻轉,即0變1,1變0。問修改之後的最大01交替子串的長度是多少 問題分析 看到題目後,不必使用暴力方法解決,可以從數學的角度...