解题报告 之 SOJ1678 Mountains
来源:互联网 发布:可以听pdf的软件 编辑:程序博客网 时间:2024/05/16 02:01
解题报告 之 SOJ1678 Mountains
Description
A mountain consists of one or more hills, each of which consists of upwards, which we denote with `/', and downwards, which we denote with '\'. We call upwards and downwards together as wards. Let /n be an upward of length n, and in the same way, let \n be a downward of length n. For example, the following upward is /2:
//
and the following downward is \3:
\ \ \
The set of all hills is given in the following:
Hills =def { /n\n | n is a natural number }
Now it comes to the definition of a mountain(in BNF):
Mountain ::= Hill | Mountain Mountain
That's to say, a hill is a mountain, and if M and N are mountains, then the concatenation of M and N is also a mountain.
For example,
/\/\/\/ \
is a mountain with 3 hills.
We define the width of a mountain as the number of upwards and downwards. We define the height of a mountain as the maximum length of upwards(or equivalently downwards).
We can give each mountain a unique number, called index, such that the following conditions are met:
- index begins with 1
- the index of a mountain with larger width is larger
- if two mountains have the same width, then the index of the mountain whose leftmost different ward with the other mountain is an upward is larger
For example, portion of the mountains and their indices are:
/\ /\ /\ /\/\ /\/\ / \ /\/\/\ /\/ \ ... /\/\/ \ /\/ \/\ ...1 2 3 4 5 9 10
In this problem, you are print the mountain from the given index.
Input
The input contains several lines, each of which contains an integer N<2^32. The last line contains 0, which you should not proceed.
Output
For each N, your program should print the mountain. For simplicity, you needn't make the mountain climbing. You can imagine that the mountain finally printed is the one after being flattened. For example, for N=9, your program should simply print:
/\/\//\\
.
Each mountain should be printed in a single line.
Sample Input
690
Sample Output
//\\/\/\/\//\\
Problem Source: siyee
#include<iostream>#include<algorithm>#include<string>#include<cmath>using namespace std;int num[50];long long q_pow( long long a, long long b ) //快速幂 计算a^b,直接用pow感觉也行{long long ans = 1;while(b){if(b & 1){ans *= a;}b /= 2;a *= a;}return ans;}int main(){long long n;while(cin >> n&&n){int w = log2( n ) + 1; //计算宽度long long loc = n - (q_pow( 2, w - 1 ) - 1);//计算目标排名在本层的相对位置int h = 1;int cnt = 1;int digit = 1;long long l = 1, r = q_pow( 2, w - 1 );while(l < r)//二分找位置填数{long long mid = (l + r) / 2;if(loc <= mid)//很容易发现前一半的解都是以digit为当前位的{num[cnt++] = digit;digit = 1;r = mid;}else //后一半的解的最小的数位为digit+1,后面接着二分{digit++;l = mid + 1;}}num[cnt] = digit;for(int j = 1; j <= cnt; j++){cout << string( num[j], '/' ) << string( num[j], '\\' );}cout << endl;}return 0;}
另外有一篇SOJ 2714是这个题的升级版,输出比较复杂,有兴趣可以看看。
- 解题报告 之 SOJ1678 Mountains
- 解题报告 之 SOJ2714 Mountains(II)
- 解题报告之DisjointSet
- 解题报告之 非诚勿扰
- Nightmare之BFS解题报告
- Asteroids之BFS解题报告
- 解题报告之 字频统计
- 解题报告之 幸运数字
- 解题报告 之 UVA1347 Tour
- 解题报告 之 HDU4289 Control
- 解题报告 之 HDU4292 Food
- 解题报告 之 SOJ4426 Counting_3
- 解题报告 之 POJ1201 Intervals
- 解题报告 之 POJ1149 Pigs
- 解题报告 之 SGU326 Perspective
- 解题报告 之 UVA563 Crimewave
- 解题报告 之 POJ3281 Dining
- 解题报告 之 ZOJ2332 Gems
- 聚美优品、京东:为什么明知假货还有人买?
- C# WinForm基础三 socket网络编程
- 阿里云ubuntu14.04的ECS主机安装Mysql步骤
- 圆括号匹配
- 如何解决“文件上传返回JSON数据,在IE下提示下载文件”的问题?
- 解题报告 之 SOJ1678 Mountains
- Windows与Linux下伪光标的显示实现
- asp.net中修改sql server express的数据
- 第58题 Maximum Subarray
- C/C++的四大内存分区
- 数据结构之贪心算法(背包问题的思考)-(十)
- 从 Yii 1.1升级到 Yii2
- android常见的事件
- Bitwise AND of Numbers Range