二進位制列舉 思維 牛客小白月賽23 A題 膜法記錄

2021-10-04 06:50:09 字數 1579 閱讀 4697

題目描述

牛牛最近在玩一款叫做《膜法記錄》的遊戲,這個遊戲的機制是這樣的:

在一局遊戲中,所有的敵人都排布在乙個 n 行 m 列的網格中,牛牛指揮著他的魔法少女對敵人進行攻擊。

攻擊有兩種型別:行blast,列blast

行blast能消滅一整行的敵人,列blast能消滅一整列的敵人

牛牛總共能夠釋放 a 次行blast,b 次列blast

給定某局遊戲的初始局面,請問牛牛能否將敵人全殲?

輸入描述:

第一行包含乙個正整數t,表示測試資料組數,接下來是t組測試資料

每組測試資料的第一行有四個正整數 n,m,a,b

接下來有n行,每行是乙個長度為m的字串,第i行第j列的字元如果是*則說明這裡有乙個敵人,如果是.說明這裡沒有

輸出描述:

對每組測試資料輸出一行,如果能消滅所有的敵人,就輸出yes,否則輸出no

先說一下,這道題的資料可能有些問題;要考慮a=0的情況;

非常思維的一道題;

首先要想到可以二進位制枚舉行,預處理取第 i 個二進位制數(也就是行的組合),消除這些行,所消除的列數,記為cnt[i];然後剩下的列數就為 m-cnt[i];

怎麼預處理是這道題的關鍵,先列舉列從1–m,然後對每一列的敵人所在的行的位置進行處理,傳化為乙個二進位制數;每乙個二進位制數代表這一列敵人行的排布;那麼cnt[i]表示排列為 i 的敵人列數;

還有個處理,例如:11011的排列,相當於我們必須取1,2,4,5行才可以把敵人消滅,但是我們取1.2.4.5時也把11010、11000等等都消滅了,所以還要找到每乙個二進位制數的1重的排列數。應該可以自己理解這個;

**:

#include

#define ll long long

#define pa pair

#define ls k<<1

#define rs k<<1|1

#define inf 0x3f3f3f3f

using

namespace std;

const

int n=

100100

;const

int m=

2000100

;const ll mod=

100000000

;int n,m,a,b,cnt[m]

;char s[25]

[n];

intsum_1

(int p)

return ans;

}int

main()

cnt[t]++;

//相同列的個數

}for

(int i=

1;i<=n;i++)}

}bool ok=

false

;for

(int i=

0;i<(1

<;i++)if

(ok) cout<<

"yes"

"no"

<}return0;

}

牛客小白月賽29 B二進位制

牛客小白月賽29 b二進位制 題目描述 scimoon 有乙個壞掉的計算器,這個計算器僅接受 0 sim 2 1 的數 這個計算器只支援一種操作,舉個例子,輸入乙個數 x,這個數會按順序進行 n 次操作,在第 i 次操作中,有乙個操作符 op i 和乙個數 a i 如果 op i 1 表示這次操作是...

二進位制列舉

fliptile 乙個反轉問題,大意是一頭牛要反轉木板,木板有黑和白,全部翻成白色的反法 輸出。小蒟蒻根本想不到 參考了大佬的部落格。點此轉入 把第一行的全部翻法都試一遍,然後看哪種的步數最少。好難想。include include int maze 20 20 int t 20 20 int f ...

二進位制列舉

一 二進位制操作 算數字運算 a 60 0011 1100 b 13 0000 1101 1.與 兩個二進位制數,同 1為 1,否則為 0。a b 12 0000 1100 2.或 兩個二進位制數,同 0為 0,否則為 1。a b 61 0011 1101 3.非 按位取反 對二進位制每一位進行了一...