昨天下午训练选用的是ZOJ月赛watashi大神出的题目(记得第一次接触watashi的时候是学习怎么写oj提交机器人,虽然看不懂,但是最后用py大法完美解决了。)
题目Link : http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3504
这题目,用c++我觉得写起来很费劲,说到底就是计算p范数。
有3行输入,比如
(1,0) (0,1) (-1,0) (0,-1) (1,0) (0,-1) (-1,0) (0,1) 1
我们计算:
1.第一二行对应两个括号形成的向量的模,比如(a,b)对应(c,d),其模为sqrt( (a-c)^2+(b-d)^2)
2.将每个模求其p次方(对应的是第三行的整数),求和
3.对总和开p次根
现在最麻烦的是处理这些括号,因为不确定个数,用c/c++,大概就是用(%lf,%lf)作为读入标志比较好。
但是,zoj是支持py的,真高兴啊,而py则可以用非常简单第代码完成这个步骤,只需要读取三行,对一二行进行正则,十分简单,最后只需要用20行多点就完成题目。
from re import compile from math import pow,sqrt import sys pt=compile(r'\((.*?),(.*?)\)') while 1: line=sys.stdin.readline() if len(line)>1: line2=sys.stdin.readline() p=float(sys.stdin.readline()) res1=pt.findall(line) res2=pt.findall(line2) x=[] y=[] ans=0.0 for i in range(len(res1)): x.append(float(res1[i][0])-float(res2[i][0])) y.append(float(res1[i][1])-float(res2[i][1])) for i in range(len(x)): ans+=pow(sqrt(x[i]**2+y[i]**2),p) print '%.08f'%pow(ans,1.0/p) else: break
人生苦短,我用py.
时间: 2024-10-23 16:47:40