zoukankan      html  css  js  c++  java
  • Christmas AtCoder

    Christmas


    Time limit : 2sec / Memory limit : 1024MB

    Score : 400 points

    Problem Statement

    In some other world, today is Christmas.

    Mr. Takaha decides to make a multi-dimensional burger in his party. A level-L burger (L is an integer greater than or equal to 0) is the following thing:

    • A level-0 burger is a patty.
    • A level-L burger (L≥1) is a bun, a level-(L−1) burger, a patty, another level-(L−1) burger and another bun, stacked vertically in this order from the bottom.

    For example, a level-1 burger and a level-2 burger look like BPPPB and BBPPPBPBPPPBB (rotated 90 degrees), where B and P stands for a bun and a patty.

    The burger Mr. Takaha will make is a level-N burger. Lunlun the Dachshund will eat X layers from the bottom of this burger (a layer is a patty or a bun). How many patties will she eat?

    Constraints

    • 1≤N≤50
    • 1≤X≤( the total number of layers in a level-N burger )
    • N and X are integers.

    Input

    Input is given from Standard Input in the following format:

    N X
    

    Output

    Print the number of patties in the bottom-most X layers from the bottom of a level-N burger.


    Sample Input 1

    Copy
    2 7
    

    Sample Output 1

    Copy
    4
    

    There are 4 patties in the bottom-most 7 layers of a level-2 burger (BBPPPBPBPPPBB).


    Sample Input 2

    Copy
    1 1
    

    Sample Output 2

    Copy
    0
    

    The bottom-most layer of a level-1 burger is a bun.


    Sample Input 3

    Copy
    50 4321098765432109
    

    Sample Output 3

    Copy
    2160549382716056
    

    A level-50 burger is rather thick, to the extent that the number of its layers does not fit into a 32-bit integer.

    第0级  P  第1级  B 第0级 P 第0级 B  ......

    所以,暴力吧,别无选择。

    切割降低级数,n级从中间切,判断在前面还是在后面,在前面就继续切,在后面就加上前面的B的个数,然后切后面

    #include<iostream>
    #include<algorithm>
    using namespace std;
    long long ttt(long long n,long long x,long long *arr,long long *brr)
    {
    	if(x<=n)		//提前结束并不会使下面循环x<=0 
    	{
    		return 0;	
    	}
    	if(n==0)
    	{
    		return 1;
    	} 
    	if(x==arr[n])	//提前跳出 
    	{
    	 	return brr[n];
    	}
    	while(1)
    	{
    		if(arr[n]/2==x)	//提前跳出
    		{
    			return brr[n-1];
    		}
    		else if(arr[n]/2>x)
    		{
    			n--;
    			x--;
    		}
    		else
    		{
    			break;
    		}
    	}
    	long long sum=brr[n-1]+ttt(n-1,x-arr[n-1]-2,arr,brr)+1;//加中间那个肉片 
    	return sum;
    	
    }
    int main()
    {
    	long long n,x;
    	cin>>n>>x;
    	long long arr[51];
    	long long brr[51];
    	brr[0]=1;
    	arr[0]=1;
    	for(int i=1;i<=n;i++)
    	{
    		arr[i]=arr[i-1]*2+3;
    		brr[i]=brr[i-1]*2+1;
    	}
    	long long sum=ttt(n,x,arr,brr);
    	cout<<sum;
    }
    

      

  • 相关阅读:
    SVN 部署(基于 Linux)
    禅道部署(基于 Linux)
    MySQL 中文乱码问题
    设置 Linux 支持中文
    SQL 文件导入数据库
    虚拟 IP 设为静态 IP
    python selenium(定位方法)
    python selenium(环境搭建)
    「杂谈」苏州人不能太膨胀
    「SAP技术」如何看Z移动类型是复制哪个标准移动类型而创建的?
  • 原文地址:https://www.cnblogs.com/mozheaishang/p/10089285.html
Copyright © 2011-2022 走看看