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