TopCoder SRM622 DIV2

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


500 堆,贪心

// 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


1000 暂时只用了第一种方法,没有用统计1的高效方法,因为对于较为高效的方法暂时没有想明白

第一种方法是一种穷举法。但是不论第一种方法还是第二种方法,都是基于一个结论。这个结论是在数据范围内。要是一个划分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





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值