虽然 python 慢,不可能真正用在 ACM 比赛上,但是同过写题提升对 python 数据和结构的运用还是很有帮助的。然而 python 如何从终端按要求读取样例成为一个很大的障碍,于是我将方法记录在这里。
这里的 python 如果不另外说明都指 python3
input() 和 raw_input() 函数
input([prompt])
prompt是提示信息,如果不需要为空就行。
raw_input() 的效果类似于 C 的 gets() 和 C++ 的 getline(),返回一个 String;
与之不同的是 input() 在对待纯数字输入时会返回所输入的数字的类型(int, float),但似乎实际使用还是返回了 String(换行符的锅?)。
a = int(input())
效果同
int a;
scanf("%d", &a);
split() 方法
str.split(str="", num=string.count(str))
它通过指定分隔符对字符串进行切片。
默认会以所有的空字符,包括空格、换行(\n)、制表符(\t)等作为分隔符,返回 List。
n, a = input().split()
效果同
int n, a;
scanf("%d%d", &n, &a);
不同的是 split() 后最终得到一个 String 的 List,所以 n 和 a 会是 String 型,后面代码的编写可能需要稍加注意。
map() 函数
map(function, iterable, ...)
根据提供的函数对指定序列做映射,返回新列表。
Python3 的 map() 返回迭代器,但是没关系,list() 就好了。
sta = list(map(int, input().split()))
效果同
#define MAX 100
int sta[MAX];
for (int i=0; i<MAX; i++) scanf("%d", &sta[i]);
而
n, a = map(int, input().split())
n 和 a 将是 int。
print() 函数
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
打印
主要问题是会自动换行,只要加上 end=""
就好了。
print(ans, end = "")
# 或
print("%d"%ans, end = "")
效果同
printf("%d", ans);
如果用 python2 会报 SyntaxError: invalid syntax
示例代码
PTA 1005 继续(3n+1)猜想
菜鸡一个,看看笑笑就好了。
# 1005
# lang: python3
a = int(input())
sta = list(map(int, input().split()))
keyn = [1] * a
ans = [0] * a
for i in range(a) :
if (keyn[i]) :
num = sta[i]
while (num > 1) :
if (num % 2 == 0) :
num //= 2
else :
num = (num * 3 + 1) // 2
for j in range(a) :
if (sta[j] == num and keyn[j]) :
keyn[j] = 0
n = 0
for i in range(a) :
if (keyn[i]) :
ans[n] = sta[i]
n += 1
ans.sort(reverse = True)
s = 0
for i in range(n) :
if (s) : print(" ", end = "")
else : s = 1
print(ans[i], end = "")
print()
python3 中 if (True) 的效率没 if (1) 高,所以 keyn 就没用布尔型。
by SDUST weilinfox
原文链接:https://www.cnblogs.com/weilinfox/p/12371608.html