250 简单题
// BEGIN CUT HERE
// END CUT HERE
#include <string>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <map>
#include <utility>
#include <cmath>
#include <queue>
#include <stack>
#include <cstring>
#include <cstdlib>
#include <set>
#include <iterator>
#include <sstream>
#include <ctime>
using namespace std;
typedef long long LL;
#define sz(x) x.size()
#define pb push_back
#define mp make_pair
#define clr(x,a) memset(x,a,sizeof(x))
#define cpy(x,a) memcpy(x,a,sizeof(x))
int fib[200];
int n;
class FibonacciDiv2 {
public:
void init(){
fib[0]=0;
fib[1]=1;
for(int i=2;fib[i-1]<1000000;n=i,i++)
fib[i]=fib[i-1]+fib[i-2];
}
int find(int N) {
init();
int pos=lower_bound(fib,fib+n+1,N)-fib;
if(pos==0)
return fib[0]-N;
else
return min(fib[pos]-N,N-fib[pos-1]);
}
// BEGIN CUT HERE
// END CUT HERE
};
// BEGIN CUT HERE
// END CUT HERE
// BEGIN CUT HERE
// END CUT HERE
#include <string>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <map>
#include <utility>
#include <cmath>
#include <queue>
#include <stack>
#include <cstring>
#include <cstdlib>
#include <set>
#include <iterator>
#include <sstream>
#include <ctime>
using namespace std;
typedef long long LL;
#define sz(x) x.size()
#define pb push_back
#define mp make_pair
#define clr(x,a) memset(x,a,sizeof(x))
#define cpy(x,a) memcpy(x,a,sizeof(x))
int vol[35];
class BoxesDiv2 {
public:
void init(){
for(int i=0;i<32;i++)
vol[i]=1<<i;
}
int findSize(vector <int> candyCounts) {
int sum=0;
init();
for(int i=0;i<sz(candyCounts);i++)
candyCounts[i]=vol[lower_bound(vol,vol+32,candyCounts[i])-vol];
priority_queue<int> pqi;
for(int i=0;i<sz(candyCounts);i++)
pqi.push(candyCounts[i]);
while(pqi.size()!=1){
int ret=pqi.top();
pqi.pop();
ret+=pqi.top();
pqi.pop();
pqi.push(ret);
}
int ret=pqi.top();
int pos=lower_bound(vol,vol+32,ret)-vol;
return vol[pos];
}
// BEGIN CUT HERE
// END CUT HERE
};
// BEGIN CUT HERE
// END CUT HERE
第一种方法是一种穷举法。但是不论第一种方法还是第二种方法,都是基于一个结论。这个结论是在数据范围内。要是一个划分nice那么除了1以外的其他数字在集合中的数量一定是很少的。并且通过排序的方法使数据有序化,从而能够进行有效的剪枝。
// BEGIN CUT HERE
// END CUT HERE
#include <string>
#include <vector>
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <map>
#include <utility>
#include <cmath>
#include <queue>
#include <stack>
#include <cstring>
#include <cstdlib>
#include <set>
#include <iterator>
#include <sstream>
#include <ctime>
using namespace std;
typedef long long LL;
#define sz(x) x.size()
#define pb push_back
#define mp make_pair
#define clr(x,a) memset(x,a,sizeof(x))
#define cpy(x,a) memcpy(x,a,sizeof(x))
class Subsets {
public:
vector<int> nextDiffer;
vector<int> num;
int one;
int n;
int dfs(int idx,int s,int p){
//cout<<idx<<" "<<s<<" "<<p<<endl;
//cout<<one<<endl;
if(idx==n || p*num[idx]>s+num[idx])
return p<s?1:0;
else
return dfs(idx+1,s+num[idx],p*num[idx])+dfs(nextDiffer[idx],s,p);
}
int findSubset(vector <int> numbers) {
sort(numbers.begin(),numbers.end());
n=sz(numbers);
num=numbers;
int t=n;
nextDiffer.resize(n,n);
//one=numbers[n-1]==1?1:0;
for(int i=n-2;i>=0;i--){
if(numbers[i]!=numbers[i+1])
t=i+1;
nextDiffer[i]=t;
// if(numbers[i]==1) one++;
}
//for(int i=0;i<n;i++)
//cout<<num[i]<<endl;
return dfs(0,0,1);
}
// BEGIN CUT HERE
// END CUT HERE
};
// BEGIN CUT HERE
// END CUT HERE