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

13 篇文章 0 订阅
4 篇文章 0 订阅

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



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值