UVA537 Artificial Intelligence? 题解
2026/5/15 22:03:05 网站建设 项目流程

UVA537 Artificial Intelligence?

题目描述

Link: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=7&page=show_problem&problem=478

PDF

输入格式

输出格式

输入输出样例 #1

输入 #1

3 If the voltage is U=200V and the current is I=4.5A, which power is generated? A light-bulb yields P=100W and the voltage is U=220V. Compute the current, please. bla bla bla lightning strike I=2A bla bla bla P=2.5MW bla bla voltage?

输出 #1

Problem #1 P=900.00W Problem #2 I=0.45A Problem #3 U=1250000.00V

Solution

大致题意

  1. 本题单测试点包含多组数据,一组数据为一行;

  2. 每组数据会以字符串的格式输入一个电学问题,可以是“已知电流和电压求功率”,“已知电压和功率求电流”,“已知电流和功率求电压”;

  3. 已知量一定会按照形如I=14mAU=0.45kVP=140MW之类的格式给出,数字和等号、等号和前面的字母之间没有空格,单位可能会用字母 m,k,M 来表示× 0.001 \times0.001×0.001× 1000 \times1000×1000× 10 6 \times10^6×106

分析

本题属于典型的自然语言处理问题,对于以自然语言形式给出的英语语句,使用 Python 中操作字符串的函数(如replace等)可以很方便的进行分析处理。

1. 提取有用信息

不难看出,对于每一条问题,有用的信息就是问题中包含等号的部分。使用 Python 的split可以将输入的一行内容按照空格的位置进行拆分成若干个字符串,找出包含等号的字符串存入一个列表即可。拆分前我们可以先考虑把逗号/问号全部移除,但是不能在这个时候移除句点因为句点符号会用作小数点
参考代码:

val=[]#将逗号换成一个空格, 然后拆分成若干部分word=input().replace(","," ").replace("?","").split()forjinrange(len(word)):#某部分包含等号就存入列表, 进行后续分析if("="inword[j]):val.append(word[j])

上述代码的功能是筛选出一个问题中包含等号的部分。以上面的代码为例,输入了下面的一句话:

If I know electric current I=2.4A and voltage U=14kV, the power is ?

列表val的值为["I=2.4A","U=14kV"],正确答案为P=33600.00W

2. 判断变量类型

在有用信息中,变量可能是电流,电压或者功率,判断的方式也很简单。只要判断字符PI或者U是否出现在有用信息中即可。参考代码:

if("P"inval[0]and"I"inval[1]):...elif("I"inval[0]and"P"inval[1]):...elif("U"inval[0]and"I"inval[1]):......

确定了已知的两个变量的类型后,就可以着手进行计算了。

3. 计算

使用replace将两条有用信息转化为数值的方法如下:

  1. "m""k""M"替换为"*0.001""*1000""*1e6"便于进行数学计算;
  2. 使用replace("P=","")replace("U=","")replace("I=","")将等号和等号前的字母移除;
  3. 使用和第 2 条类似的方法去掉表示单位的字母AVW

部分代码:

if("U"inval[1]and"I"inval[0]):#将有用信息转化为纯数值val[1]=val[1].replace("U=","").replace("k","*1000").replace("m","*0.001").replace("M","*1e6").replace("V?","").replace("V.","").replace("V","")val[0]=val[0].replace("I=","").replace("k","*1000").replace("m","*0.001").replace("M","*1e6").replace("A?","").replace("A.","").replace("A","")

列表val=["I=2.4A","U=14kV"]在经过上述处理后会变成["2.4","14*1000"],根据电学关系式P = U I P=UIP=UI,用eval计算并保留两位小数输出即可,参考代码:

#输出结果print("U=%.2fV"%(eval(val[0])*eval(val[1])))

4. 输出

UVA 的题目一定要严格按照题目要求输出!需要说明的是:

  1. 所有输出保留两位小数,前面要带上U=I=P=
  2. 输出答案前要先输出“Problem #多少”;
  3. 一组答案完毕后要输出一个空行,这一点请参照 PDF 题面(否则会被判定为 Presentation Error)。有些 OJ 允许 Presentation Error 获得部分分数,但在洛谷上会判定为 WA。

5. 完整代码

n=int(input())foriinrange(n):val=[]word=input().replace(","," ").split()forjinrange(len(word)):if("="inword[j]):val.append(word[j])print("Problem #%d"%(i+1))if("P"inval[0]and"I"inval[1]):val[0]=val[0].replace("P=","").replace("k","*1000").replace("m","*0.001").replace("M","*1e6").replace("W?","").replace("W.","").replace("W","")val[1]=val[1].replace("I=","").replace("k","*1000").replace("m","*0.001").replace("M","*1e6").replace("A?","").replace("A.","").replace("A","")print("U=%.2fV"%(eval(val[0])/eval(val[1])))elif("I"inval[0]and"P"inval[1]):val[0]=val[0].replace("I=","").replace("k","*1000").replace("m","*0.001").replace("M","*1e6").replace("A?","").replace("A.","").replace("A","")val[1]=val[1].replace("P=","").replace("k","*1000").replace("m","*0.001").replace("M","*1e6").replace("W?","").replace("W.","").replace("W","")print("U=%.2fV"%(eval(val[1])/eval(val[0])))elif("U"inval[0]and"I"inval[1]):val[0]=val[0].replace("U=","").replace("k","*1000").replace("m","*0.001").replace("M","*1e6").replace("V?","").replace("V.","").replace("V","")val[1]=val[1].replace("I=","").replace("k","*1000").replace("m","*0.001").replace("M","*1e6").replace("A?","").replace("A.","").replace("A","")print("P=%.2fW"%(eval(val[1])*eval(val[0])))elif("U"inval[1]and"I"inval[0]):val[1]=val[1].replace("U=","").replace("k","*1000").replace("m","*0.001").replace("M","*1e6").replace("V?","").replace("V.","").replace("V","")val[0]=val[0].replace("I=","").replace("k","*1000").replace("m","*0.001").replace("M","*1e6").replace("A?","").replace("A.","").replace("A","")print("P=%.2fW"%(eval(val[1])*eval(val[0])))elif("P"inval[0]and"U"inval[1]):val[0]=val[0].replace("P=","").replace("k","*1000").replace("m","*0.001").replace("M","*1e6").replace("W?","").replace("W.","").replace("W","")val[1]=val[1].replace("U=","").replace("k","*1000").replace("m","*0.001").replace("M","*1e6").replace("V?","").replace("V.","").replace("V","")print("I=%.2fA"%(eval(val[0])/eval(val[1])))elif("P"inval[1]and"U"inval[0]):val[1]=val[1].replace("P=","").replace("k","*1000").replace("m","*0.001").replace("M","*1e6").replace("W?","").replace("W.","").replace("W","")val[0]=val[0].replace("U=","").replace("k","*1000").replace("m","*0.001").replace("M","*1e6").replace("V?","").replace("V.","").replace("V","")print("I=%.2fA"%(eval(val[1])/eval(val[0])))print("")#看pdf版本的输入输出样例, 相邻两组数据中间有一个空行!

拓展

除了题目以外,电学中还有一个常用的物理量是电阻R RR。关于电阻的电学公式有:
U = I R U=IRU=IR
P = U 2 R = I 2 R P=\dfrac{U^2}{R}=I^2RP=RU2=I2R
如果引入了电阻这个物理量,在已知电流和电压的情况下,就必须设计额外的代码块来判断是求功率还是电阻。一种可能的方案是判断有没有出现单词 resistance(n. 阻碍,阻抗,电阻)。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询