題目描述
牛牛最近在玩一款叫做《膜法記錄》的遊戲,這個遊戲的機制是這樣的:
在一局遊戲中,所有的敵人都排布在乙個 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.非 按位取反 對二進位制每一位進行了一...