ZZULIOJ 2123

来源:互联网 发布:mac的网页开发工具 编辑:程序博客网 时间:2024/06/05 14:09


2123: 倒水(Water)

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 325  Solved: 72

SubmitStatusWeb Board

Description

一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水。接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子。每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃。(不能丢弃有水的瓶子) 显然在某些情况下CC无法达到目标,比如N=3,K=1。此时CC会重新买一些新的瓶子(新瓶子容量无限,开始时有1升水),以到达目标。 现在CC想知道,最少需要买多少新瓶子才能达到目标呢?

Input

第一行一个整数T,表示有T组数据。 接着T行,每行两个正整数, N,K(1<=N<=10^9,K<=1000)。

Output

一个非负整数,表示最少需要买多少新瓶子。

Sample Input

3
3 1
13 2
1,000,000 5

Sample Output

1
3
15808

主要的思路就是倒水,将所有的水都往要保留下的水杯里面,然后题目要求最少还要买多少杯水,那么从所需要留的杯子第一个开始,一直从该扔的瓶子里组合与其相等水量往里面倒水,组不成则换下一个,知道最后一个也不能组成,此时所需要的则为最少的。

比较坑的一点就是题目输入的时候有逗号,所以输入的数据要用字符串处理,很坑、


#include<bits/stdc++.h>using namespace std;long long int a[1000001];int main(){    int n,j;    string e,f;    long long int a,b,d;    long long int x;    scanf("%d",&n);    while(n--)    {        a=0;        b=0;        cin>>e>>f;        x=1;        for(int i=e.size()-1;i>=0;i--)        {            if(e[i]>='0'&&e[i]<='9')            {                a=a+x*(e[i]-'0');            }            else            {                x=x/10;            }            x=x*10;        }        x=1;        for(int i=f.size()-1;i>=0;i--)        {            if(f[i]>='0'&&f[i]<='9')            {                b=b+x*(f[i]-'0');            }            else            {                x=x/10;            }            x=x*10;        }        d=a;        int c;        a=a-b;        for(int i=1; i<=b; i++)        {            int t=0;            if(d<=b||d==b+1)            {                printf("0\n");                break;            }            c=1;            for(j=1;;j++)            {                if(i<b)                {                    a=a-c;                    if(a<0)                    {                        a=a+c;                        break;                    }                    else if(a==0)                    {                        printf("0\n");                        t=1;                        break;                    }                    c=c*2;                }                else if(i==b)                {                    a=a-c;                    if(a<0)                    {                        a=fabs(a);                        printf("%lld\n",a);                        break;                    }                    else if(a==0)                    {                        printf("0\n");                        break;                    }                    c=c*2;                }            }            if(t==1)            {                break;            }        }    }    return 0;}


0 0