Kattis - cokolada【水】

Kattis - cokolada【水】

这里写图片描述

题意

有一个人想吃巧克力,但是巧克力都是按照 2 的幂次的数量包装的,然后他想吃一定数量块的巧克力,然后可以敲碎,每次敲碎都分成两半,比如四块装的分成两块就是二块和二块,但是只能买一块,求要买的那块的数量,和要敲几次

思路

因为数据比较小,可以先打一个 2 的幂次的表,然后二分查找最少的那个数量,然后每次都剪掉一半,然后往下找,直到减为0 就跳出 然后用 大的减最小的那个数 就可以了

AC代码

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <deque>
#include <vector>
#include <queue>
#include <string>
#include <cstring>
#include <map>
#include <stack>
#include <set>
#include <cstdlib>
#include <ctype.h>
#include <numeric>
#include <sstream>
using namespace std;

typedef long long LL;
const double PI  = 3.14159265358979323846264338327;
const double E   = 2.718281828459;  
const double eps = 1e-6;
const int MAXN   = 0x3f3f3f3f;
const int MINN   = 0xc0c0c0c0;
const int maxn   = 1e5 + 5; 
const int MOD    = 1e9 + 7;
int vis[21];
int k, ans, flag;

int main()
{
    for (int i = 0; i < 21; i++)
        vis[i] = 1 << i;
    cin >> k;
    for (int i = 0; i < 21; i++)
    {
        if (vis[i] >= k)
        {
            ans = vis[i];
            flag = i;
            break;
        }
    }
    if (vis[flag] == k)
        printf("%d %d\n", ans, 0);
    else if (k % 2)
        printf("%d %d\n", ans, flag);
    else
    {
        k -= ans/2;
        int i;
        for (i = flag; i >= 0; i--)
        {
            if (k >= vis[i])
                k -= vis[i];
            if (k == 0)
                break;
        }
        printf("%d %d\n", ans, flag - i);
    }
}
posted @ 2018-03-04 20:31  Dup4  阅读(147)  评论(0编辑  收藏  举报