799D - Field expansion - CodeForces Solution


brute force dp meet-in-the-middle *2100

Please click on ads to support us..

C++ Code:

#include <bits/stdc++.h>
#define inf INT_MAX
#define longlonginf LONG_LONG_MAX
#define mod 1000000007
#define MAXN 100005
#define pii pair<ll,ll>
#define ll long long
#define deb(x) cerr<<"[ "<<#x<<" = "<<x<<" ]";
#define yes() cout<<"YES\n";
#define no() cout<<"NO\n";
using namespace std;
 
ll n,m,cur,q,k,x,y,z;
ll ans = 0;
string subtask;

void solve(){
  ll w,h,tw,th;
  cin>>w>>h>>tw>>th>>n;
  ll a[n];
  for(int i = 0 ; i < n ; i++){
    cin>>a[i];
  }
  if( ( w <= tw && h <= th ) || ( w <= th && h <= tw ) ) {
    cout<<0<<"\n";
    return;
  }
  sort(a,a+n,greater<ll>());
  for(int i = 0 ; i < min(n,(ll)34) ; i++){
    vector<ll> v1,v2;
    ll t1 = (i+1)/2;
    ll t2 = i+1 - t1;
    //generate v1
    for(ll j = 0; j < (1<<t1) ; j++){
      x = 1;
      for(ll k = 0 ; k < 20 ; k++){
        if( (1<<k) & j ) x *= a[k];
      }
      v1.push_back(x);
    }
    //generate v2
    for(ll j = 0; j < (1<<t2) ; j++){
      x = 1;
      for(ll k = 0 ; k < 20 ; k++){
        if( (1<<k) & j ) x *= a[k+t1];
      }
      v2.push_back(x);
    }
    //merge
    sort(v2.begin(),v2.end());
    //~ for(auto u : v1) cout<<u<<" ";
    //~ cout<<"\n";
    //~ for(auto u : v2) cout<<u<<" ";
    //~ cout<<"\n";a
    vector<ll>::iterator it;
    ll total = *(v2.end()-1);
    ll total2 = *max_element(v1.begin(),v1.end());
    for(auto u : v1){
      //no flip
      bool good1 = 1, good2 = 1;
      ll foo = (w+u*tw-1)/(u*tw);
      it = lower_bound(v2.begin(),v2.end(),foo);
      if( it == v2.end() ){
        good1 = 0;
      }
      else{
        ll p = (total2/u)*(total/(*it));
        if(!(u*(*it)*tw >= w && p*th >= h) ) good1 = 0; 
      }
      //flip
      foo = (h+u*tw-1)/(u*tw);
      it = lower_bound(v2.begin(),v2.end(),foo);
      if( it == v2.end() ){
        good2 = 0;
      }
      else{
        ll p = (total2/u)*(total/(*it));
        if(!(u*(*it)*tw >= h && p*th >= w) ) good2 = 0;
      }
      //check
      if( good1 || good2 ){
        cout<<i+1<<"\n";
        return;
      }
    }
  }
  cout<<-1<<"\n";
}
 
int main(){
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int T = 1;
  //cin>>T;
  for(int i = 0 ; i < T ; i++){
    //cout<<"Case #"<<i+1<<": ";
    solve();
  }
  return 0;
}
 
/*
  you thought u declared it huh?
  not i but x
  logical operator
  wrong example/proof
  thoroughly
  wrong variables
  thinking it wrong
  bruh just try some test case
  capitals ;-;
  wrong data structure lol
  count memory usement
  corner case
  oversized array
  orders
  statements
  size initializer
  while con
  map -> array
  wrong digits??
  swapped variables??
  check if theres any variabled
  that got declared twice
  find some pattern
  name collision
  constraints??!
  mod !!
  resets
*/


Comments

Submit
0 Comments
More Questions

e-maze-in
Bricks Game
Char Sum
Two Strings
Anagrams
Prime Number
Lexical Sorting Reloaded
1514A - Perfectly Imperfect Array
580A- Kefa and First Steps
1472B- Fair Division
996A - Hit the Lottery
MSNSADM1 Football
MATCHES Playing with Matches
HRDSEQ Hard Sequence
DRCHEF Doctor Chef
559. Maximum Depth of N-ary Tree
821. Shortest Distance to a Character
1441. Build an Array With Stack Operations
1356. Sort Integers by The Number of 1 Bits
922. Sort Array By Parity II
344. Reverse String
1047. Remove All Adjacent Duplicates In String
977. Squares of a Sorted Array
852. Peak Index in a Mountain Array
461. Hamming Distance
1748. Sum of Unique Elements
897. Increasing Order Search Tree
905. Sort Array By Parity
1351. Count Negative Numbers in a Sorted Matrix
617. Merge Two Binary Trees