用python写ACM题

虽然 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(*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

猜你喜欢

转载自www.cnblogs.com/weilinfox/p/12371608.html