zoukankan      html  css  js  c++  java
  • 1052-水王争霸

    描述

           为了丰富校园网络生活,学校 BBS 举行了一次水王争霸赛。比赛开始后,选手们疯狂灌水,都想争取到水王这个荣誉称号。但学校的 BBS 是如此的不堪一击,才 1e-3 秒就超负荷了。        现在需要把选手们灌的水集合起来,降低服务器负荷。        事情是这样得到处理的:        假设每个选手每次灌水量为1L,每灌一次水,服务器就用一个容量为无限的虚拟容器收集这1L水。        最后服务器中有N个容器收集了水。而服务器最多能负载K个装了水的容器。但是,服务器只有一种自救措施:就是把两个装了同样多水的容器合并到这两个容易中的其中一个,另一个空了的直接free它。 然而不能排除这种情况的存在:通过自救方式,仅由选手们灌好的N容器水不能恰恰好收集成不超过K个非空容器来装。比如,N=3,K=1的时候,无论如何收集,都只能得到容量分别为1L和2L的两个非空容器,不可能得到符合要求的1个非空容器。幸运的是,服务器还有一点点空间,允许你再灌若干次水,使得 BBS 恢复正常。拯救服务器中的虚拟世界这个艰巨而光荣的任务就落到你身上了。

    输入

    有1000组输入数据,每组输入数据一行,包含两个正整数N、K,其中N不超过10,000,000,K不超过1,000。

    输出

     

    输出最少需要继续灌水的次数,如果不可能拯救服务器,输出-1。

    样例输入

    3 1

    13 2

    1000000 5

    100 100

    样例输出

    1

    3

    15808

    0

    #include<iostream>
    using namespace std;
    int main()
    {
        int count=1000;
        int n,k, s[100],i,j,sum,p,q;
        while(count--)
        {
            p=0;
            i=0;
            j=1;
            sum=0;
            cin>>n>>k;
            while(n)
            {
                if(n%2==1)
                {
                    s[i++]=j;
                }
                n=n/2;
                j=j*2;
            }
            while(i>k)
            {
                sum=sum+s[p+1]-s[p];
                s[p]=s[p+1];
                while(s[p]==s[p+1])
                {
                    for(q=p+1;q<i-1;q++)
                    {
                        s[q]=s[q+1];
                    }
                    i--;
                    s[p]=s[p]*2;
                }
    
            }
        //    cout<<s[p+1]<<s[p];
            cout<<sum<<endl;
        }
        return 0;
    } 
    

      

  • 相关阅读:
    python class属性
    获取安卓系统日志输出
    深入理解C#中的IDisposable接口(转)
    Mac开启自带的Apache服务器
    【转】《Unity Shader入门精要》冯乐乐著 书中彩图
    AssetDatabase的方法总结
    C# 读写XML文件的方法
    tkinter模块常用参数(python3)
    Unity在Project视图里面显示文件的拓展名
    Git忽略提交规则
  • 原文地址:https://www.cnblogs.com/Rosanna/p/3436661.html
Copyright © 2011-2022 走看看