【CSDN编程竞赛•第四期】Python题解

目录

一、部分题解

1、小玉家的电费

题目描述:

输入描述:

输出描述:

示例:

代码及思路:

2、单词逆序

题目描述:

输入描述:

输出描述:

示例:

代码及思路:

3、小Q整数分割

输入描述:

输出描述:

示例:

代码及思路:

4、新型美丽数列

输入描述:

输出描述:

示例:

代码及思路:

二、比赛小结及对官方的建议

小结:

给官方的一些建议:


一、部分题解

1、小玉家的电费

时间限制:1000ms                        内存限制:256M

题目描述:

小玉家今天收到了一份电费通知单。上面写着:月用电量在150千瓦时及以下部分按每千瓦时0.4463元执行;月用电量在151~400千瓦时的部分按每千瓦时0.4663元执行;月用电量在401千瓦时及以上部分按每千瓦时0.5663元执行。请根据电价规定,计算出应交的电费应该是多少。

输入描述:

输入一个整数,表示用电总计(单位以千瓦时计),不超过10000。

输出描述:

输出一个数,保留到小数点后1位(单位以元计,保留到小数点后一位)。

示例:

输入

267

输出

121.5

代码及思路:

题目言简意赅,纯签到,照着题目写就完事了

import sys


amount = int(sys.stdin.readline().strip())
result = 0

if amount <= 150:
    result = 0.4463 * amount
elif 151 <= amount <= 400:
    result = 0.4463 * 150 + 0.4663 * (amount - 150)
else:
    result = 0.4463 * 150 + 0.4663 * 250 + 0.5663 * (amount - 400)

print('%.1f' % result)    # 注意保留小数位

2、单词逆序

时间限制:1000ms                        内存限制:256M

题目描述:

对于一个字符串,请设计一个算法,只在字符串的单词间做逆序调整。例如:输入“I am a boy!”,输出“boy! a am I”。

输入描述:

输入一行字符串str。(1 <= strlen(str) <= 10000)

输出描述:

返回逆序后的字符串

示例:

输入

It's a dog!

输出

dog! a It's

代码及思路:

这题也是没有什么思路,关键点在于用replace()方法在字符串输入时把末尾带的换行符'\n'给消掉,之后用split()以空格' '为分割点把各个单词和符号给分出来并存进列表最后逆序输出即可。

import sys


s = sys.stdin.readline().strip().replace('\n', '')
lst = s.split(' ')
for i in range(len(lst) - 1, -1, -1):
    print(lst[i], end='')
    if i != 0:
        print(' ', end='')

3、小Q整数分割

时间限制:1000ms                        内存限制:256M

题目描述:

小Q决定吧一个整数n,分割成k个整数。

每个整数必须大于等于1。

小Q有多少方案。

输入描述:

输入整数n,k。(1 <= n, k<= 100)

输出描述:

输出方案数。答案对1e9+7取模。

示例:

输入

3 3

输出

1

代码及思路:

我们可以将整数n看成是由n个1组成的数列,因此每两个1之间就会存在一个间隙,我们可以通过取间隙的方法将n份1分为k段。

因此,我们可以很容易得出n个数就会有n-1个间间隙,要分成k段就需用到k-1个间隙,如此,问题就转化为了我们排列组合问题。方案数 = (n - 1)(n - 2)……(n - k + 1) / 1 / 2 / …… / (k - 1)。

import sys


n, k = map(int, sys.stdin.readline().split())

if k > n:        # 特判下k > n的情况
    print(0)
    sys.exit()

a = b = 1
for i in range(1, k):
    a *= (n - i)
    b *= i

a /= b
print('%.0f' % (a % (1e9 + 7)))

4、新型美丽数列

时间限制:1000ms                        内存限制:256M

题目描述:

定义美丽数列A:
1. 数列中相邻的数越是靠内相对大小加一,a[2]=a[1]+1,a[n-2]=a[n-1]+1…
2. 距离边缘距离相等的数的大小相等:a[0] = a[n-1],a[1] = a[n-2]…
通过修改数列中的值使得给定数列变成美丽数列。
修改后的值必须仍是正整数。

输入描述:

第一行输入整数n。(1 <= n <= 1000)表示数列的大小。

第二行输入n个整数。

输出描述:

输出最小修改次数。

示例:

输入

3
1 1 1

输出

1

代码及思路:

题目的意思蛮好理解的,就是要实现一个值先递增后递减的列表,同时列表满足相邻的值相差1,及左右对称的金字塔型数列。

比较遗憾的是,本题在比赛的过程中我没能调试出来,最后取巧混到30%的分数。代码后续会在这里补充。

二、比赛小结及对官方的建议

小结:

加上本次第四期的比赛,一共是参与了第三期、第四期,两次比赛。前一次脑袋没怎么转过弯来,导致成绩不是很理想,这次侥幸进了前三。第四期没有再出现第三期出现的选择题类型,还是蛮庆幸的,毕竟之前的选择题覆盖的知识面(语言知识)还是蛮广的,而这次的全编程题倒是能让参赛的大伙更从容一些。

给官方的一些建议:

1.首先是题目方面,在描述上可以再清晰准确些,同时题目所给的测试样例的出错率还需降一降。

2.在模板方面,毕竟是编程题,题目直接给出模板后反而更偏向函数题类型了。

你可能感兴趣的:(Python,python)