首页 > 代码库 > ZOJ-3504 P-norm(py大法好)

ZOJ-3504 P-norm(py大法好)

昨天下午训练选用的是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.



ZOJ-3504 P-norm(py大法好)