这也是京东的 在线编程题。。。
也是发现了详细的解答博客:http://blog.tk-xiong.com/archives/956
内容:
第一题:爬山
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
小B曾经酷爱网络游戏,整日通宵达旦的玩游戏,导致身体素质急剧下降,因此下决心痛改前非,远离一切电子产品,并通过远足爬山的方式改变生活方式并提高身体素质。由于担心对身体造成太大的负荷,他总是选择最平坦的路径,并记录每天的行程情况及达到的最高海拔,使得连续两天之间的海拔之差最多为一个单位。不幸的是,在行程结束时,他不小心掉进河里,造成部分记录信息遗失。他想知道自己行程中可能达到的最高海拔,你是否能够帮忙?
输入
输入有若干组,每组的第一行为空格分隔的两个整数n和m,1<=n<=10^8, 1<=m<=10^5,分别表示行程天数以及未遗失的记录数。随后紧跟m行,每行为空格分隔的两个整数d和h,1<=d<=n, 0<=h<=10^8,表示行程的第几天及当天达到的最高海拔。
输出
对每组输入,如果记录是可能的,则在单独的行中输出可能达到的最高海拔,否则输出字符串“IMPOSSIBLE”(不含引号)。
样例输入
8 2
2 0
7 0
8 3
2 0
7 0
8 3
样例输出
2
IMPOSSIBLE
Hint
第一天和最后一天的海拔可以是任何值。
题目的意思比较明确,就是小B从网络游戏转行爬山了,但是体力不好,每天只能上一个单位,或者下一个单位,或者不上不下 (假设不是上两个下一个这样的),然后问他最高能到啥位置。
我们看第一组样例:
天号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
最大值1 | 1 | 0 | 1 | 2 | 2 | 1 | 0 | 1 |
最大值2 | 1 | 0 | 1 | 1 | 2 | 1 | 0 | 1 |
这是可能的情况,其他还有很多都不列举了。
然后我直接说解法:
这里的vi 是 <天,高度>
这里的 v是哪一天的号码。
求出来的temp 是 2 0 和 7 0 它们之间能够达到的最大高度。
即 : (7-2)/2 + (h(7) – h(2))/2 – 即两天相差的天数 和 他们的高度 与最大值的关系。
这里要注意的是… 还得考虑到 2 – 1 和 7 – 0 这样的情况。
这种情况下 我的 公式计算出来的是 2 ,但是实际情况是这样的:
天号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
高度 | 1 | 2 | 3 | 2 | 1 | 0 |
所以最大值实际是3…但是因为AC代码是这样的。所以不太敢乱改了。
这样对数据 2-1 7-0 计算出来就是 (7 – 2 + 1 + 0) /2 = 3.
因为我提交的时候,前面可能错误的方法AC了,所以就没有管了,具体用哪个公式…我觉得第二个对。
可能还是题目给的例子不全吧…
然后怎么判断Impossible 就是给出的两个数据的高度差值大于天数间距,这种情况下无论如何都不可能达到恰好每天增长或减少1的。嗯…大致就是这个思路
然后注意还要判断首和尾…即从第一天开始 到 给出的第一个数据之间,还有从给出的最后一个数据到最后一天。
原博客是用C写的代码,我用python写的:
def code(k):
result=""
while k>0:
if k % 2 == 0:
result="7"+result
else:
result="4"+result
k=(k-1)//2
if k == 0:
return int(result)
while 1:
s=raw_input()
if s=="":
break
s=s.strip()
num = int(s)
input_list=[]
for _ in xrange(num):
s = raw_input().strip()
d = int(s)
input_list.append(d)
for i in range(num):
print code(input_list[i])
第二题幸运数:
时间限制:C/C++语言 1000MS;其他语言 3000MS
内存限制:C/C++语言 65536KB;其他语言 589824KB
题目描述:
4和7是两个幸运数字,我们定义,十进制表示中,每一位只有4和7两个数的正整数都是幸运数字。前几个幸运数字是:4,7,44,47,74,77,444,447…
现在输入一个数字k,输出第k个幸运数
输入输出我忘了。
样例输入
3
5
100
10000000
样例输出
74
744747
44774447447477474444447
这题,画出二叉树来就知道了。。。
python代码:
def code(k):
result=""
while k>0:
if k % 2 == 0:
result="7"+result
else:
result="4"+result
k=(k-1)//2
if k == 0:
return int(result)
while 1:
s=raw_input()
if s=="":
break
s=s.strip()
num = int(s)
input_list=[]
for _ in xrange(num):
s = raw_input().strip()
d = int(s)
input_list.append(d)
for i in range(num):
print code(input_list[i])