0. ã¯ããã«
ãããæ¼ç®ã«ã¤ãã¦ã¯ã以ä¸ã®è¨äºã§ç¹éãã¾ããã
ãããããã®ä¸ã§ãbit å ¨æ¢ç´¢ã«é¢ãã説æãã ãã¶ç°¡æ½ãããã®ã§ãã¡ããã¨æ¸ããããªã¨æã£ã¦ããã®è¨äºæ¸ãã¾ãï¼ï¼ï¼ãã ãããããæ¼ç®ã«é¢ããç¥èã¯åæã¨ãã¦ããã®ã§ãããã«ä¸å®ã®ããæ¹ã¯ä¸ã®è¨äºãèªãã§ãããããã¨æãã¾ãã
å ·ä½çã«ã¯ã以ä¸ã®è¡¨ãè¦ã¦ãã³ã¨ããªãã£ãå ´åã«ã¯ãå ã«ä¸è¨ã®è¨äºãèªãã§ãããããã¨æãã¾ãã
ãªãããã®è¨äºã¯ã
ã® 6 æ¥ç®ã®è¨äºã¨ãã¦æ¸ãã¾ããã
ã
1. bit å ¨æ¢ç´¢ã§ä½ãã§ããã
bit å ¨æ¢ç´¢ã¨ã¯ã
åã®ãã®ãããããã¤ãé¸ã¶æ¹æ³ãå
¨åæãã¦èª¿ã¹ä¸ããææ³
ã§ãï¼ï¼ï¼ åã®ãã®ããããã¤ãé¸ã¶æ¹æ³ã¯ã
éãã®é¸æè¢ãããã¾ãããã¨ãã°
ã®ã¨ãã3 åã®ã¢ã¤ãã {2, 1, 0} ããããã¤ãé¸ã¶æ¹æ³ã¯ä¸å³ã®ããã«
éãããã¾ãï¼ï¼ï¼
ããã§ããã¾ã£ããé¸ã°ãªããã¨ããæ¹æ³ãå«ãã¦ãããã¨ã«æ³¨æãã¾ããã
bit å ¨æ¢ç´¢ã使ãããªããã¨ããã¨ãã°ãããªåé¡ã解ããããã«ãªãã¾ãï¼ï¼ï¼
åã®æ£ã®æ´æ°
ã¨ãæ£ã®æ´æ°
ã¨ãä¸ãããã¾ãã
ã®ä¸ããä½åãé¸ãã§ç·åã
ã¨ãããã¨ãã§ãããã©ãããå¤å®ãã¦ãã ããã
ãã®åé¡ã¯ã¾ãã«ã åã®åç©ããä½åãé¸ã¶ãã¨ããæ¹æ³ããã¹ã¦èª¿ã¹ã¤ãããã¨ã§è§£ããã¨ãã§ãã¾ãã
ã
2. bit å ¨æ¢ç´¢ã®èãæ¹
çªç¶ã§ãããä¸å³ã® åã®é¸æè¢ã¯ãããããä¸å³ã®ããã«ã1 ã¤ã®æ°å¤ãã§è¡¨ããã¨ãã§ãã¾ãï¼ï¼ï¼ï¼ï¼
ãã®ããã«ãbit å ¨æ¢ç´¢ã¯ã
åã®ã¢ã¤ãã ããããã¤ãé¸ã¶æ¹æ³ ( {2, 1} ã¨ã )
- æ´æ°å¤ ( 6 ã¨ã )
ã¨ãä¸å¯¾ä¸ã«å¯¾å¿ä»ããææ³ã§ããå
·ä½çãªå¯¾å¿æ¹æ³ãèãã¾ãããã¨ãã° åã®ã¢ã¤ãã {2, 1, 0} ã«å¯¾ãã¦ã {2, 1} ãé¸ã¶æ¹æ³ã«ã¤ãã¦èãã¦ã¿ãã¨ã
- äºé²æ³è¡¨è¨ã§
æ¡ã®ãããåãèãã¦ã1 æ¡ç®ã¨ 2 æ¡ç®ã« 1 ãç«ã£ã¦ãããã®ãèãã¾ãï¼ 110ã(0 æ¡ç®ãä¸çªå³ã§ã2 æ¡ç®ãä¸çªå·¦ã§ã)
- ãããåé²æ³ã«ç´ãã¾ãï¼6
ãã£ãããã ãã§ãï¼ï¼ï¼
åã®ã¢ã¤ãã ããããã¤ãé¸ã¶æ¹æ³ã¯
éãããã¾ããããããã«å¯¾ãã¦
ã¨ããæ´æ°å¤ã«å¯¾å¿ä»ãããã¨ãã§ãã¾ããbit å
¨æ¢ç´¢ã§
for (int bit = 0; bit < (1<<N); ++bit) { }
ã¨ããã³ã¼ããæ¸ãã®ã¯ãã¾ãã«ãã®ãã¨ã表ãã¦ãã¾ãããããã¤ãé¸ã¶æ¹æ³ãã bit ã¨ããæ´æ°ã«å¯¾å¿ä»ãã¦ããã®ã§ãã
次ã«ãéã®ãã¨ãèãã¦ã¿ã¾ããããã¤ã¾ãã
- bit ã¨ããæ´æ°å¤ã
- ã©ããããé¸ã³æ¹ãã表ãã¦ããã®ã
ã解éãç´ãå¿ è¦ãããã¾ãããã£ãããããã¤ãé¸ã¶æ¹æ³ãã 1 ã¤ã®æ´æ°å¤ã§å·§ã¿ã«è¡¨ããã¨ãã§ãã¦ãããã®æ´æ°ããã©ãé¸ã¶ãã¨ãæå³ãã¦ããã®ãããããããªãã¨ãä½ãã§ãã¾ãã...
ãã
3. æ´æ°å¤ããããããã¤ãé¸ã¶æ¹æ³ãã¸ã®å¾©å
ãããããã®é¨åããbit å ¨æ¢ç´¢ã«ããã¦ãå¤ãã®æ¹ãããããªã«ãã£ã¦ãã®ï¼ï¼ãã¨ãªãé¨åããããã¾ãããä¸ã®ãããªã³ã¼ããããè¦ãã¨æãã¾ããããã¯ãå®ã¯ãã¾ãã«å¾©å å¦çããã£ã¦ããã®ã§ãã
if (bit & (1 << i)) { }
æ´æ°å¤ bit ããããããã¤ãé¸ã¶æ¹æ³ãã復å ããæ¹éã¯ãå®ã¯ã¨ã¦ãåç´æå¿«ã§ãã ã
ãæ¹éã
ã®ããããã«ã¤ãã¦ã æ´æ°å¤ bit ã§è¡¨ããããé¸ã³æ¹ãã«ããã¦ãã
ãé¸ã¶ãã©ããããå¤å®ããã
ã
ããããã§ããã°ãæ´æ°å¤ bit ããããããã¤ãé¸ã¶æ¹æ³ãã復å
ãããã¨ãã§ãã¾ããããã§å
·ä½ä¾ã¨ãã¦ãã
ãèãã¦ã¿ã¾ãã
ã«å¯¾ãã¦ããbit & (1 << i)ãã®å¤ãã©ããªãããè¦ã¦ã¿ã¾ãããããªããbit = 13 ã¯ãããåã§è¡¨ãã¨
- bit = 01101
ã§ãããã¨ã«æ³¨æãã¾ãã
i | 1 << i | bit & (1 << i) |
---|---|---|
0 | 00001 | 01101 & 00001 = 00001 (True) |
1 | 00010 | 01101 & 00010 = 00000 (False) |
2 | 00100 | 01101 & 00100 = 00100 (True) |
3 | 01000 | 01101 & 01000 = 01000 (True) |
4 | 10000 | 01101 & 10000 = 00000 (False) |
ãªãã¨è¦äºã«ã
ã
ã«å«ã¾ãã¦ããã¨ããbit & (1 << i) 㯠True
ã
ã«å«ã¾ãã¦ããªãã¨ããbit & (1 << i) 㯠False
ã¨ãªã£ã¦ãã¾ãï¼ï¼ï¼1 å 1 åç´è§£ãã¨ã以ä¸ã®ãããªæãã§ãã
- (1 << i) ã¨ã¯ãi æ¡ç®ã®ã¿ã 1 ã§ä»ã¯ 0 ã§ãããããªãããåã§ãã
- bit & (1 << i) ã¨ããã®ã¯ãi æ¡ç®ã®ã¿ãæ®ãã¦ä»ã®æ¡ã¯ãã¹ã¦ãµããè½ã¨ã㦠0 ã«ãã¦ãã¾ãå¦çã§ãã
- ãã£ã¦
- bit ã® i æ¡ç®ã 1 ã§ããã°ãbit & (1 << i) ã® i æ¡ç®ã 1 ã§æ®ãã¾ã (ä»ã®æ¡ã¯ãã¹ã¦ 0)
- bit ã® i æ¡ç®ã 0 ã§ããã°ãbit & (1 << i) ã® i æ¡ç®ã 0 ã«ãªãã¾ã (ãã¹ã¦ã®æ¡ã 0)
ã¤ã¾ã (1 << i) ã¨ããã®ã¯ãi æ¡ç®ã®ã¿ãæ®ãã¦ä»ã®æ¡ã 0 ã«ãã¦ãã¾ããã£ã«ã¿ã¼ã®å½¹å²ãæããã¾ãã
ãã®èãæ¹ã¯ãbit å
¨æ¢ç´¢ä»¥å¤ã§ããè¤æ°æ¬ã®ãã©ã°ã管çããå ´é¢ã§ãã°ãã°ç¨ãã¾ããé»åå·¥ä½ãªããããã£ã¦ãã¨ã åã® LED ã®ãã¡ã®ã©ããå
ã£ã¦ãããããããå
ã§ç®¡çãã¾ãããã®ã¨ãã«
çªç®ã® LED ãå
ã£ã¦ãããã©ããããã¾ãã«ä¸ã®ãããªæ¸ãæ¹ã§èª¿ã¹ãããã¾ãã
if (bit & (1 << i)) { }
ã¾ã¨ããã¨ãint åãããããã¤ãé¸ã¶æ¹æ³ãã¸ã®å¤æã¯ä»¥ä¸ã®ãããªã³ã¼ãã§ã§ãã¾ããããã¯ãint åå¤æ° ãå¼æ°ã¨ãã¦åãåã£ã¦ãããã«å¯¾å¿ãããã©ã®ã¢ã¤ãã ãé¸ã¶ã®ãããè¿ãé¢æ°ã§ãã
// int åããã©ã®ã¢ã¤ãã ãé¸ã¶ã®ããã表ã vector<int> åã«å¤æ // bit: éåã表ãæ´æ° // N: ä½åã®ãã®ã«ã¤ãã¦èãã¦ããã vector<int> IntegerToVector(int bit, int N) { vector<int> S; for (int i = 0; i < N; ++i) { if (bit & (1 << i)) { S.push_back(i); } } return S; }
ç´°ãã注æç¹ 1
å®è£
ä¸ã¯ãvector
- å i = 0, 1, ... ã«å¯¾ãã¦
- i ã bit ã§è¡¨ãããéåã«å«ã¾ãããã¨ãããã£ãã
- ããã«å¿ããå¦çããã®å ´ã§è¡ã£ã¦ãã¾ã
ã¨ããå®è£ ããããã¨ãå¤ãããã«æãã¾ãã
ç´°ãã注æç¹ 2
if (bit & (1 << i))
ã¨ããæ¸ãæ¹ã«ã¯ãããä¸ã¤ã®æ¸ãæ¹ãããã¾ãã
if ((bit >> i) & 1)
ã
4. bit å ¨æ¢ç´¢ã®ä¾
ããã§ã¯å ·ä½çãªåé¡ã解ãã¦ããã¾ãããï¼ï¼ï¼
ã
ä¾é¡ 1ï¼ é¨åååé¡
ã¾ãã¯ãbit å ¨æ¢ç´¢ã®åºæ¬åé¡ã»é¨åååé¡ããè¡ãã¾ãã
åé¡æ¦è¦
åã®æ£ã®æ´æ°
ã¨ãæ£ã®æ´æ°
ã¨ãä¸ãããã¾ãã
ã®ä¸ããä½åãé¸ãã§ç·åã
ã¨ãããã¨ãã§ãããã©ãããå¤å®ãã¦ãã ããã
å¶ç´
解æ³
ãã®åé¡ã¯ã
åã®ãã®ããããã¤ãé¸ã¶
éãã®æ¹æ³ãå ¨æ¢ç´¢ãã¦
- é¸ãã ç·åã
ã«ä¸è´ãããã®ããããã©ãããå¤å®ãã
ã¨ãã bit å
¨æ¢ç´¢æ³ã®ããã«ãããããªåé¡ã§ããï¼ã¾ãã¯ãç°¡æ½ãªã³ã¼ãã£ã³ã°ãæèããã«ãæç´ã«ãint åã vector
è¨ç®éã¯ã éãããããã«ã¤ãã¦ã調ã¹ãã®ã«
ã ããããã®ã§ã
ã¨ãªãã¾ãã
#include <iostream> #include <vector> using namespace std; // int åã vector åã«å¤æ // bit: éåã表ãæ´æ° // N: ä½åã®ãã®ã«ã¤ãã¦èãã¦ããã vector<int> IntegerToVector(int bit, int N) { vector<int> S; for (int i = 0; i < N; ++i) { if (bit & (1 << i)) { S.push_back(i); } } return S; } int main() { // å ¥å int N, W; cin >> N >> W; vector<int> a(N); for (int i = 0; i < N; ++i) cin >> a[i]; // bit å ¨æ¢ç´¢ bool exist = false; for (int bit = 0; bit < (1 << N); ++bit) { // ã©ããé¸ã¶ã vector<int> S = IntegerToVector(bit, N); // é¨åéåã«å¯¾å¿ããç·å int sum = 0; for (int i : S) sum += a[i]; // å¤å® if (sum == W) exist = true; } if (exist) cout << "Yes" << endl; else cout << "No" << endl; }
å®è£ ãæè»ã«ç°¡æ½ã«
æ £ãã¦ããããããå°ãç°¡ç¥åãã¦ã
- æ´æ°å¤ bit ã§è¡¨ããããé¸ã³æ¹ãã«ããã¦ãã¢ã¤ãã
ãé¸ã¶ã®ãã©ãããå¤å®ãã
- å«ã¾ãããªãããã«å¿ããå¦ç
ãã¾ã¨ãã¦ãã£ã¦ãã¾ãã¾ãããã以ä¸ã®ããã«æ¸ãã¾ãã
#include <iostream> #include <vector> using namespace std; int main() { // å ¥å int N, W; cin >> N >> W; vector<int> a(N); for (int i = 0; i < N; ++i) cin >> a[i]; // bit å ¨æ¢ç´¢ bool exist = false; for (int bit = 0; bit < (1 << N); ++bit) { int sum = 0; for (int i = 0; i < N; ++i) { if (bit & (1 << i)) sum += a[i]; } // å¤å® if (sum == W) exist = true; } if (exist) cout << "Yes" << endl; else cout << "No" << endl; }
ã
ä¾é¡ 2ï¼ AtCoder ABC 147 C - HonestOrUnkind2
ã¤ãããªãã ã® ABC ã§åºé¡ããã¦ãã令å ABC ã® C åé¡ã§æãé£ããåé¡ãã¨ãã¦è©±é¡ã«ãªã£ãåé¡ã§ããï¼ï¼
人ã®ãã¡ãã誰ãæ£ç´è
ãªã®ãããé¸ã¶æ¹æ³ã¯
éãããã¾ãããããå
¨é¨èª¿ã¹ä¸ãã¾ãï¼ï¼ï¼
åé¡æ¦è¦
人ããã¦ããããããæ£ç´è
ãã§ãããããä¸è¦ªåãªäººãã§ãããã®ããããã§ãã
- ãæ£ç´è ãã¯ãå¿ ããæ£ãããã¨ãèªã
- ãä¸è¦ªåãªäººãã¯ãçå½ä¸æã®ãã¨ãèªã (æ£ãããã誤ããã¯ããããªã)
ä»ã 人ããããã次ã®ããã«èªãã¾ããã
人ç®ã¯ã
åã®è¨¼è¨ãèªã£ã
人ç®ã«ãã
åç®ã®è¨¼è¨ã¯ä»¥ä¸ã®ããããã§ãã
ããã¯ãæ£ç´è ãã§ã (
)
ããã¯ãä¸è¦ªåãªäººãã§ã (
)
人ããããã®ãæ£ç´è
ãã§ããããä¸è¦ªåãªäººãã§ãããã®ãã¿ã¼ã³ã®ãã¡ã以ä¸ã®è¨¼è¨ã«çç¾ããªããã®ã¯ããã¤ãèãããã¾ã (0 éãããããã¾ã)ããã®ãã¡ãæ£ç´è
ãæãå¤ããã¿ã¼ã³ã§ã¯ãæ£ç´è
ã¯ä½äººã§ããããï¼
å¶ç´
解æ³
ãã®åé¡ã¯ãã¨ã«ããæ¹é決ãã大åã§ãã以ä¸ã®ãããªæèã«èµ°ã£ã¦ãã¾ãã¨ãè¿·èµ°ãã¾ã...
- ã¨ããããã誰ããæ£ç´è ã«æ±ºãã¦ã¿ãã...
- 人 A ãæ£ç´è ã¨ä»®å®ããã¨ããã®äººã®è¨¼è¨ãããB ãã㨠C ããã¯æ£ç´è ã§ãD ããã¯ä¸è¦ªåã¨ãããã¨ã«ãªã£ã¦...
- ããããã¨ãã¾ã B ãããæ£ç´è ã¨ãããã¨ãããB ããã®è¨¼è¨ãã...
人éããã®ç¨®ã®ããºã«ã解ãã¨ãããããã風ã«è§£ãã¨æãã¾ããããã®æ¹éã§ããã¨è¾ãã§ãã
ããã§ã次ã®ããã«èãã¦ã¿ã¾ããã
誰ãæ£ç´è ã§ã誰ãä¸è¦ªåãªã®ããå®å ¨ã«æ±ºãæã¡ãã¦ãã¾ãããã®ãã¿ã¼ã³ã¯
éããã
ãã®æ±ºãæã¡ãæ´åãã¦ããã®ãã©ããã check ãããã¤ã¾ãã証è¨ã¨çç¾ããªããã©ããã check ãã
check ãéã£ããã®ã«ã¤ãã¦ãæ£ç´è ã®äººæ°ãæ°ããããã®æ大å¤ãåºåããã
ãã¤ã³ãã¯ãã誰ãæ£ç´è ã§èª°ãä¸è¦ªåãªã®ããå®å ¨ã«æ±ºãæã¡ããã¨ãå ¨å¡ã®è¨¼è¨ãæ´åãã¦ãããã©ãããç°¡åã«ç¢ºèªã§ãããã¨ããç¹ã§ããå®è£ ãã¦ã¿ã¾ãããã
#include <iostream> #include <vector> using namespace std; // 1 ã¤ã®è¨¼è¨ã表ãæ§é ä½ using pint = pair<int,int>; // ã人ãã¨ã0 or 1ã // å ¥å int N; vector<vector<pint>> v; // æ´æ° bit ã«å¯¾å¿ããã決ãæã¡ããæ´åãã¦ããããå¤å® bool judge(int bit) { // i 人ç®ã®è¨¼è¨ãæ¤è¨¼ãã for (int i = 0; i < N; ++i) { // i 人ç®ããä¸è¦ªåãã ã£ããã証è¨ã¯ãã¹ã¦ç¡æå³ if ( !(bit & (1 << i)) ) continue; // ããããç¢ºèª for (pint xy : v[i]) { int x = xy.first; // x ã int y = xy.second; // y = 1: æ£ç´ãy = 0: ä¸è¦ªå // y = 1 ãªã®ã«ãä¸è¦ªåãã ã£ãããã¡ if (y == 1 && !(bit & (1 << x))) return false; // y = 0 ãªã®ã«ãæ£ç´è ãã ã£ãããã¡ if (y == 0 && (bit & (1 << x))) return false; } } return true; } int main() { cin >> N; v.resize(N); for (int i = 0; i < N; ++i) { int A; cin >> A; v[i].resize(A); for (int j = 0; j < A; ++j) { cin >> v[i][j].first >> v[i][j].second; --v[i][j].first; // 0-indexed ã« } } int res = 0; for (int bit = 0; bit < (1 << N); ++bit) { // çç¾ check if (judge(bit)) { // bit ã«å«ã¾ãã人æ°ãæ°ãã int count = 0; for (int i = 0; i < N; ++i) { if (bit & (1 << i)) ++count; } res = max(res, count); } } cout << res << endl; }
çºå±æ 1ï¼ è¨¼è¨ check
ä¸ã®ã³ã¼ãã®
// y = 1 ãªã®ã«ãä¸è¦ªåãã ã£ãããã¡ if (y == 1 && !(bit & (1 << x))) return false; // y = 0 ãªã®ã«ãæ£ç´è ãã ã£ãããã¡ if (y == 0 && (bit & (1 << x))) return false;
ã®é¨åã¯ãã¾ã¨ãã¦æ¬¡ã®ããã«æ¸ãã¾ã
if ( ((bit >> x) & 1) ^ y ) return false;
ã
5. æå¾ã«
bit å ¨æ¢ç´¢ã®åé¡ã¯ã¨ãããå¶ç´ãå°ãããã bit å ¨æ¢ç´¢ãæ³å®ãªã®ã¯æãããã¨è¨ãããã¡ã§ãããããããã®è¦ç¹ã¯éè¦ãªãã¨ãè¦è½ã¨ãã¦ãã¾ããããªå±æ§ãããã¾ããããã¯
- ãã©ãã決ããã°å ¨ä½ã決ã¾ãããã¨ããè¦ç¹ãå¿ããã«èå¯ãããã¨ã¯ãå¶ç´ã大ããã¦ãéè¦
ã ã¨æãããã§ããããã¦ãç¹ã«ãæ£ç´è ã¨åã¤ãã®åé¡ãã«ã¯ã以ä¸ã®éè¦ãªæè¨ãå«ã¾ãã¦ããã¨æãã¾ãã
åé¡ã«å¯¾ãã¦åãããæ°å¦çèå¯ã°ããã«èµ°ã£ã¦ãã¾ãã®ã¯å±éºã§ãæ°å¦ãããªãã¦æ¢ç´¢ã§ã§ãããªãæ¢ç´¢ãã¹ãã§ãã
æ°å¦çèå¯ã¯ãæ¢ç´¢ç¯å²ãçµãããã«ä½¿ã (ãã®ãã¿ã¼ã³ã¯æ¬å½ã«ç¡æ°ã«ãã)
æ¬å½ã®é«é£æ度åé¡ã«ãªãã¨ããã®éãã«è¡ããã¯ããããªãã®ã§ããã700 ç¹åé¡ã¾ã§ã§ããã°ãä¸è¨ã®å¿æ§ãã§è§£ããããã«æãã¾ããé度ã«æ°å¦çèå¯ã«èµ°ãã®ã§ã¯ãªããæ¢ç´¢ãã¹ãã¨ããã¯ãã£ããæ¢ç´¢ã§ããããã«ãããã¨ã大äºããªã¨...èªæãè¾¼ãã¦ã
ããã§ã¯ããã¦ã㪠bit å
¨æ¢ç´¢ã©ã¤ããï¼ï¼ï¼
bit å
¨æ¢ç´¢ã®æ¬¡ã¯ãbit DP ãï¼ï¼ï¼