紙コーダー未満

主に競技プログラミングについてです。Topcoder(togatogah)、Codeforces(togatoga)に参加してます。

SRM622 Div2 MEDIUM BoxesDiv2

本番では問題文の題意が理解できずに苦しんだ。

問題

それぞれ異なる種類のキャンディーの個数からなるcandyCounts数列が与えられ
2^i(i >=0)の個のキャンディーがはいる箱がそれぞれ無限個存在する。(1,2,4,8,・・・)
同じ種類のキャンディーは同じ箱の中に入れなければならない,さらにキャンディーの入った二つの箱をより大きい箱にいれることができる。
(大きい箱の容量が二つの箱の容量の合計以上のとき、キャンディーの個数ではない)
全てのキャンディーを一つの箱にいれるのに必要な最小の箱の容量を求めよ。

解法

与えられるキャンディーの個数をx
変換する個数をyとする。
2^(j-1)< x <=(2^j = y)個に変換した数列を作成した。
その数列の合計をsumとし,2^(i-1) < sum <=(2^(i) = result)なresultを返した。

コード

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <string>
#include <vector>
#include <complex>
#include <cstdlib>
#include <cstring>
#include <numeric>
#include <sstream>
#include <iostream>
#include <algorithm>
#include <functional>
#include <bitset>
#include <fstream>
#include <limits.h>
 
#define mp       make_pair
#define rep(i,n) for(int i=0;i<(n);i++)
 
using namespace std;
 
typedef    long long          ll;
typedef    pair<int,int>      pii;
 
const int INF=1<<29;
const double EPS=1e-9;
 
const int dx[]={1,0,-1,0},dy[]={0,-1,0,1};
class BoxesDiv2 {
    public:
    int findSize(vector<int> candy) {
  int result;
        sort(candy.begin(),candy.end());
        int i;
        int n = candy.size();
        int sum = 0;
        vector<int> data;
        for(int i = 0;i < n;i++){
            for(int j = 1;;j *=2){
                if(candy[i]<=j){
                    data.push_back(j);
                    break;
                }
            }
        }
        for(int i = 0;i < n;i++){
            // cout <<data[i]<<endl;
            sum +=data[i];
        }
 
        for(i = 1;;i *=2){
            if(sum <=i){
                return i;
            }
        }
    return result;
    }
};
 
// Powered by Greed 2.0-RC