ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【题解】倒水

2019-04-09 13:49:35  阅读:317  来源: 互联网

标签:倒水 tmp 升水 int 题解 瓶子 CC lowbit


题目描述

  一天,CC买了N个容量可以认为是无限大的瓶子,开始时每个瓶子里有1升水。接着~~CC发现瓶子实在太多了,于是他决定保留不超过K个瓶子。每次他选择两个当前含水量相同的瓶子,把一个瓶子的水全部倒进另一个里,然后把空瓶丢弃。(不能丢弃有水的瓶子)
显然在某些情况下CC无法达到目标,比如N=3, K=1,因为你会发现,把任意一个瓶子倒到另一瓶子后,只剩下一个1升水的瓶子和一个2升水的瓶子,这两个瓶子无法再相互倒水了,因此超过了K。 此时CC可以重新买一些新的瓶子(新瓶子容量无限,开始时有1升水),以到达目标,例如再买一个新瓶子,那么就有2个1升水的瓶子,把它们倒在一起,就得到一个2升水的瓶子,这样再和之前的2升水的瓶子倒在一起,最后就只剩下一个4升水的瓶子了,满足条件。
  现在CC想知道,最少需要买多少新瓶子才能达到目标呢?如果无论买多少个瓶子都无法满足条件,则输出-1。

 

驶入输出格式

输入格式

  多组测试数据。
    第一行:一个整数r,表示共有r组测试数据,1<=r<=10。
    每组测试数据的格式是:
     一行两个正整数, N, K (1<=N<=10^7,K <= 1000)。

 

输出格式

  共r行,每行对应一组测试数据,一个非负整数,表示最少需要买多少新瓶子。

 

输入输出样例

输入样例

3
3  1
13  2
1000000  5

 

输出样例

1
3
15808

 

题解

  可以看出此题不存在-1的情况。

  其实可以用$n$的二进制形式来表示起始的瓶子拥有情况,DFS一遍所有添加情况即可。

#include <iostream>

#define lowbit(x) ((x) & -(x))

using namespace std;

int G;
int n, k;
int maxn; 
int ans;

void DFS(int now, int lim, int cnt)
{
    if(now > maxn) return;
    int tmp = now, tot = 0;
    while(tmp)
    {
        ++tot;
        tmp -= lowbit(tmp);
    }
    if(tot <= k) 
    {
        ans = min(cnt, ans);
        return;
    }
    tmp = now;
    while(tmp)
    {
        if(lowbit(tmp) > lim) DFS(now + lowbit(tmp), lowbit(tmp), cnt + lowbit(tmp));
        tmp -= lowbit(tmp);
    }
    return;
} 

int main()
{
    cin >> G;
    int tmp;
    while(G--)
    {
        cin >> n >> k;
        tmp = n;
        while(tmp != lowbit(tmp)) 
        {
            tmp -= lowbit(tmp);
        }
        maxn = tmp << 1;
        ans = 1 << 30;
        DFS(n, 0, 0);
        cout << ans << "\n"; 
    }
    return 0;
}
参考程序

 

标签:倒水,tmp,升水,int,题解,瓶子,CC,lowbit
来源: https://www.cnblogs.com/kcn999/p/10676381.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有