Construction sets 二分+背包

来源:互联网 发布:比特精灵软件下载 编辑:程序博客网 时间:2024/06/01 07:33


XVII Open Cup named after E.V. Pankratiev. XXI Ural Championship


二分      用bitset处理背包


#include <bits/stdc++.h>using namespace std ;typedef long long ll ;int n , down , up ;int m[10000] , c[10000] ;bitset<10005> f , temp;bool check(int K){    f.reset() ; f[0] = 1 ;    for(int i = 1 ; i <= n ; i ++ ){        int tot = c[i] / K ;        int g = 1 ;        ll v = m[i] ;        temp = f ;        /*        while( tot ){            if(v > up) break ;            f |= f << v ;            tot -= g ;            g = min(g*2 , tot) ;            v = (ll)m[i] * g ;        }*/        for(int j = 1 ; j <= tot ; j ++ ){            if(v * j > up) break ;            f |= temp << ( v * j ) ;        }    }    for(int j = down ; j <= up ; j ++ ){        if(f[j]) return true ;    }    return false ;}int main(){    while( ~ scanf("%d %d %d" , &n , &down , &up)){        for(int i = 1 ; i <= n ; i ++ ){            scanf("%d %d" , &m[i] , &c[i]) ;        }        int l = 0 , r = 1e6 ;        while( l < r ){            int mid = (l + r + 1) >> 1 ;            if(check(mid)) l = mid ;            else  r = mid - 1 ;        }        cout << l << endl ;    }    return 0 ;}


原创粉丝点击