• cf437B The Child and Set


    B. The Child and Set
    time limit per test
    1 second
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    At the children's day, the child came to Picks's house, and messed his house up. Picks was angry at him. A lot of important things were lost, in particular the favorite set of Picks.

    Fortunately, Picks remembers something about his set S:

    • its elements were distinct integers from 1 to limit;
    • the value of  was equal to sum; here lowbit(x) equals 2k where k is the position of the first one in the binary representation of x. For example, lowbit(100102) = 102, lowbit(100012) = 12, lowbit(100002) = 100002 (binary representation).

    Can you help Picks and find any set S, that satisfies all the above conditions?

    Input

    The first line contains two integers: sum, limit (1 ≤ sum, limit ≤ 105).

    Output

    In the first line print an integer n (1 ≤ n ≤ 105), denoting the size of S. Then print the elements of set S in any order. If there are multiple answers, print any of them.

    If it's impossible to find a suitable set, print -1.

    Sample test(s)
    input
    5 5
    
    output
    2
    4 5
    
    input
    4 3
    
    output
    3
    2 3 1
    
    input
    5 1
    
    output
    -1
    
    Note

    In sample test 1: lowbit(4) = 4, lowbit(5) = 1, 4 + 1 = 5.

    In sample test 2: lowbit(1) = 1, lowbit(2) = 2, lowbit(3) = 1, 1 + 2 + 1 = 4.

    贪心……从第一位向上贪心,然后每次往上合并。

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    int bh[20][100010],fa[20][100010],gs[20];
    int pre[100010];
    int n,limt,sum,ans[100010];
    int getw(int x)
    {
        int res=0;
        while(x)
        {
           x=x>>1;res++;
        }
        return res-1;
    }
    void solve()
    {
        int i,j;
        for(i=0;i<=18;i++) 
        {
            if((1<<i) & sum) 
            {
                if(gs[i]>0)
                {
                    for(j=bh[i][gs[i]];j;j=pre[j]) ans[++ans[0]]=j;
                    gs[i]--;
                }
                else {printf("-1
    ");return;}
            }
            for(j=1;j<=gs[i];j+=2)
            {
                if(j+1<=gs[i])
                {
                    pre[fa[i][j+1]]=bh[i][j];
                    gs[i+1]++;bh[i+1][gs[i+1]]=bh[i][j+1];fa[i+1][gs[i+1]]=fa[i][j];
                }
            }
        }
        printf("%d
    ",ans[0]);
        for(i=1;i<=ans[0];i++) printf("%d ",ans[i]);
    }
    int main()
    {
        int i,x,y;
        cin>>sum>>limt;    
        for(i=1;i<=limt;i++)
        {
           x=(i & (-i));
           y=getw(x);
           gs[y]++;
           fa[y][gs[y]]=i;bh[y][gs[y]]=i;
        }
        solve();
        return 0;
    }
    

      

    ——by zhber,转载请注明来源
  • 相关阅读:
    Uva 11205 The broken pedometer
    Uva 331 Mapping the Swaps
    vs2005里取得offsetHeight,clientHeight,scrollHeight 三个属性值全都一样的问题
    网页根据自身高度动态调整所在iframe的高度
    一个简单的实现tab效果的demo
    iframe根据被嵌网页高度动态调整自身高度
    用window.open方法打开新窗口显示提示信息
    用C#在ASP.NET 2.0 的 TreeView 中查找某一节点
    解决 sharepoint 站点除了administrator 其他用户不能登陆的问题
    Python处理Excel,学会这十四个方法,工作量减少大半!
  • 原文地址:https://www.cnblogs.com/zhber/p/4036122.html
Copyright © 2020-2023  润新知