ビットシフトについて使い方が分かりやすい問題です。
atcoder.jp
問題概要
この問題は、購入した商品(とある集合における任意の部分集合)の価格を合計するという問題です。各商品はビットが立っている箇所で表現されています。商品の価格はべつの配列で表現されています。
問題の解決方針としては、下記の通りです。(実装する前にメモした方針です。)
方針
- n桁までループ
- iをn桁までインクリメントする
- Xをiビットシフトする
- シフトしたXの1桁目が1であるか(ビットが立っているか)を確認する
- 1であればa[i]を価格の合計に加算する
コード
using System; namespace easy_Atcoder { class Program { static void Main(string[] args) { int[] nx = Array.ConvertAll(Console.ReadLine().Split(),int.Parse); int n = nx[0]; int X = nx[1]; int[] a = Array.ConvertAll(Console.ReadLine().Split(),int.Parse); int sum = 0; for(int i = 0; i<n ;i++){ if(((X>>i)&1)==1){ sum += a[i]; } } Console.WriteLine(sum); } } }
((X>>i)&1)==1
この箇所がビットシフトの箇所になります。iビット右にシフトすることができます。