昨天下午訓練選用的是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.