zoukankan      html  css  js  c++  java
  • Yandex.Algorithm 2011 A. Double Cola

    1.题目描写叙述:点击打开链接

    2.解题思路:本题是一道找规律的数学题,通过题意描写叙述不难知道,相当于有5棵二叉树构成了一个森林,须要你按层次遍历找到第n个人是谁。

    观察后不难发现,如果最開始的一层为第0层,序号n所在层为l,那么0~l-1层之间有5*(2^l-1)个结点,令5*(2^l-1)=n,计算得。l=log(n/5+1)/log(2)。

    因为第l-1层最后一个人的序号是ed=5*(2^l-1),第l层每一个人有2^l个,设k每一个人的序号(从0開始),则k=(n-ed-1)/(2^l)。事先用一个数组保存全部人的姓名。

    3.代码:

    #define _CRT_SECURE_NO_WARNINGS
    #include<iostream>
    #include<algorithm>
    #include<string>
    #include<sstream>
    #include<set>
    #include<vector>
    #include<stack>
    #include<map>
    #include<queue>
    #include<deque>
    #include<cstdlib>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<ctime>
    #include<functional>
    using namespace std;
    
    
    typedef long long ll;
    typedef unsigned int uint;
    typedef unsigned long long ull;
    typedef pair <int, int> P;
    
    char*names[]={"Sheldon", "Leonard", "Penny", "Rajesh", "Howard"};
    
    int main()
    {
        int n;
        while(~scanf("%d",&n))
        {
            int l=log(((n-1)/5)+1)/log(2);//计算第n个人的层。注意用n-1整除5
            int ed=5*((1<<l)-1);//计算第l-1层最后一个人的序号
            int k=(n-ed-1)/(1<<l);获得第k个人的序号(从0開始。最大是4)
            puts(names[k]);输出第k个人姓名
        }
        return 0;
    }
    
    

  • 相关阅读:
    数组
    分支.顺序结构
    博客作业-查找
    DS博客作业-图
    DS 数据结构-树
    数据结构-栈,队列
    博客作业05-指针
    C语言博客作业04-数组
    C语言博客作业03——函数
    c语言博客作业02-循环结构
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6790318.html
Copyright © 2011-2022 走看看