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整除5int ed=5*((1<<l)-1);//计算第l-1层最后一个人的序号int k=(n-ed-1)/(1<<l);获得第k个人的序号(从0开始,最大是4)puts(names[k]);输出第k个人姓名}return 0;}

版权声明:本文为博主原创文章,未经博主允许不得转载。

,我希望你能知道,我的心永远只为你跳动。

Yandex.Algorithm 2011 A. Double Cola

相关文章:

你感兴趣的文章:

标签云: