算法 幸运数+爬山


这也是京东的 在线编程题。。。

也是发现了详细的解答博客: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])


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值