Tenka1 Programmer Contest 参加記録

CD解けたのにunratedになり悲しいコンテストでした

C - 4/N

3変数あるが式変形して2変数の値を全探索O(N2)

int main()
{
  ios::sync_with_stdio(false);
  cin.tie(0);
  ll N; cin >> N;
  FOR(n,1,3501) {
    FOR(w,1,3501) {
      if(4 * n * w > N * (w + n)) {
        if((N * n * w) % (4 * n * w - N * (w + n)) == 0) {
          cout << (N * n * w) / (4 * n * w - N * (w + n)) << " " << n << " " << w << endl;
          return 0;
        }
      }
    }
  }
}

D - IntegerotS

bitwise orがKのビットが立っているとこだけ1になるようにする。もしくはKのビットが立っているところ1つは1にならないようにするとそのビットより下位のビットを全て1にできるので有利かもしれない。1にならないようにする桁を全て試せばOK。

int main()
{
  ll N, K; cin >> N >> K;
  ll A[N], B[N]; FOR(i,0,N) cin >> A[i] >> B[i];
  ll ans = 0;
  FOR(j,0,32) {
    // jより上は1のとこしかだめ
    if((K>>j)&1) {
      ll mx = 0;
      FOR(l,0,N) {
        bool ok = true;
        FOR(i,j,32) {
          if((!((K>>i)&1)||(i==j)) && (A[l]>>i)&1) ok = false;
        }
        if(ok) mx += B[l];
      }
      ans = max(ans, mx);
    }
  }
  ll mx = 0;
  FOR(l,0,N) {
    bool ok = true;
    FOR(i,0,32) {
      if(!((K>>i)&1) && (A[l]>>i)&1) ok = false;
    }
    if(ok) mx += B[l];
  }
  ans = max(ans, mx);
  cout << ans << endl;
  return 0;
}