c++的map映射可以提前规定好映射的格式,然后可以根据键值直接添加
python的dict使用{}初始化,不能直接根据键值添加,否则为nonetye
总结pta1095
list函数append只接受一个参数,有些排序问题可以append([a,b])进行
编程经验,遇到大的任务不要慌,分解成小功能挨个实现,同时清楚每个小功能是什么
- 切片要认准对什么切片,例如字典切片item[0]还是item[1]
- 功能的内聚和耦合观念,什么样的功能放main里什么样的功能放子函数里
- 想办法把重复的代码抽象为不重复的代码,增加代码复用性
#存在运行超时问题
#把关于case项的输出放在外面控制
def case1(charac):
#使用显式的字母判断反而不能体现出抽象了
list_charac=[]
for item in all_info.items():
if charac in item[0]:
list_charac.append([item[0],item[1]])
list_charac=sorted(list_charac,key=lambda x:x[0])
list_charac=sorted(list_charac,key=lambda x:x[1],reverse=True)
if len(list_charac)==0:
print('NA')
else:
for i in list_charac:
print(i[0],i[1])
def case2(hallid):
num_allp,num_alls=0,0
flag=False
for item in all_info.items():
if item[0][1:4]==hallid:
flag=True
num_allp+=1
num_alls+=item[1]
if not flag:
print("NA")
else:
print(num_allp,num_alls)
def case3(date):
#numP descent,if equal hallid ascent
dict_case3,list_case3={},[]
for item in all_info.items():
#print(item[0][4:10],date)
if item[0][4:10]==date:
dict_case3[item[0][1:4]]=dict_case3.get(item[0][1:4],0)+1
for item in dict_case3.items():
list_case3.append([item[0],item[1]])
if len(list_case3)==0:
print('NA')
else:
list_case3=sorted(list_case3,key=lambda x:x[0])#sorted 是稳定排序
list_case3=sorted(list_case3,key=lambda x:x[1],reverse=True)
for i in list_case3:
print(i[0],i[1])
num_student,num_move=map(int,input().split())
all_info={}
for _ in range(num_student):
per_info=input().split()
all_info[per_info[0]]=int(per_info[1])
for i in range(num_move):
case,info=input().split()
print("Case {}: {} {}".format(i+1,case,info))
if case=='1':
case1(info)
elif case=='2':
case2(info)
elif case=='3':
case3(info)
else:
pass
case1函数的抽象程度就比较高,并没有分A,B,T三类讨论写三遍代码,应该作为经验
1094谷歌的招聘
1.减法与range掺了,原本减法已经和list的下标吻合了,range又向前取了一位
在大数量级单次判断素数不应使用筛法,可能内存会爆
#按照字符串分割为长度为4的大小
#时间复杂度为线性,可以做,转换为数字使用列表存储,再判断是否位素数(最早,应该使用筛法来做(不可))
#小于10的正整数#单纯筛选10亿大小的量,应该会超时
#大长度的素数题反而不能使用爱是筛选法,否则内存会爆,判断素数注意1不是素数需要特殊处理
'''
list_prime=[]
num_length,num_prime=map(int,input().split())
index=[True]*(10**10)
for i in range(2,10**10):
if index[i]:
list_prime.append(i)
for j in range(i*2,10**10,i):
index[j]=False
'''
#那儿出错了????
import math
num_length,num_prime=map(int,input().split())
def isPrime(n):
if n==1:
return false
flag=True
for i in range(2,int(math.sqrt(n))+1):
if n%i==0:
flag=False
break
return flag
list_num=[]
str_data=input()
for i in range(0,num_length-num_prime+1):
list_num.append(int(str_data[i:i+num_prime]))
#print(list_num)
flag,ans=False,0
for i in list_num:
if isPrime(i):
print('0'*(num_prime-len(str(i)))+str(i))
flag=True
break
if not flag:
print('404')
1090危险品装箱
数据结构选用正确,后面循环问题出了低级错误,跳过本次循环使用continue,退出循环用break一定要分清
如何找bug,上溯分支法,定位到错误位置
能运行,并能处理简单数据说明语法没问题,可能是逻辑问题
需要掌握提供数据的能力
- (提供答案运行条件,是否运行,运行几次,常用语“---”,“here run”,“happend!!”)。
- 输出数据与数据类型,看看数据是否正确
#很容易超时,单纯遍历的话
num_cant,num_gruop=map(int,input().split())
dict_cant={}
for _ in range(num_cant):
list_per=input().split()
try:
if list_per[0] in dict_cant:
#dict_cant[list_per[0]]=dict_cant[list_per[0]].append(list_per[1])
dict_cant[list_per[0]].append(list_per[1])
else:
dict_cant[list_per[0]]=[list_per[1]]
except:
print("there happend something wrong")
try:
if list_per[1] in dict_cant.keys():
#dict_cant[list_per[1]]=dict_cant[list_per[1]].append(list_per[0])
dict_cant[list_per[1]].append(list_per[0])
else:
dict_cant[list_per[1]]=[list_per[0]]
except:
print("something wrong")
#使用字典存储所有可能冲突的组合
for _ in range(num_gruop):
list_group=input().split()
flag=True
#print("------------------------")
#print(type(dict_cant[list_group[1]]))
#print(dict_cant)
#print(list_group)
for i in range(1,len(list_group)):
#print('to do')#运行一次
if not flag:
break
else:
if list_group[i] not in dict_cant:
#print('has hapend not in keys!')#运行一次
continue
for j in range(i+1,len(list_group)):
#print(i,j)#没运行
#if i==2 and j==4:
# print(list_group[j], dict_cant[list_group[i]])
if list_group[j] in dict_cant[list_group[i]]:
# print('happend!!')
flag=False
break
if flag:
print("Yes")
else:
print("No")
''' '''
记录程序日志,以防对同一问题处理两边
1092最好吃的月饼,有处理意外输入的的意识
num_mooncookie,num_cities=map(int,input().split())
list_num=[0]*(num_mooncookie+2)
for _ in range(num_cities):
list_per=input().split()
for i in range(num_mooncookie):
list_num[i+1]+=int(list_per[i])
max_=max(list_num)
print(max_)
ans=[]
for i in range(len(list_num)):
if list_num[i]==max_:
ans.append(str(i))#list_num产生的时候已经做了处理,ans直接按list_num的索引来即可
if max_==0:
ans=[str(i) for i in range(1,num_mooncookie+1)]
print(' '.join(ans))
else:
print(' '.join(ans))
深入理解题意类 1092 字符串A+B (20 分)
给定两个字符串 A 和 B,本题要求你输出 A+B,即两个字符串的并集。要求先输出 A,再输出 B,但重复的字符必须被剔除。
input
This is a sample test
to show you_How it works
output
This ampletowyu_Hrk
#区分大小写,自己和自己也要有约束,看看目前的是否在前面
#保留两个原始输入
str1=input()
str2=input()
ans=''
for i in str1:
if i not in ans:
ans+=i
for i in str2:
if i not in ans:
ans+=i
print(ans)
自认为 有艺术感的代码
函数抽象,与函数内部处理都非常棒,以后多看看
1084 外观数列 (20 分)
def theNextOne(str_):
index,cnt,ans=0,0,''
for i in str_:
if str_[index]==i:
cnt+=1
else:
ans+=str_[index]+str(cnt)
index+=cnt
cnt=1
if index==0:
ans=str_[0]+str(cnt)
elif index<len(str_):
ans+=str_[-1]+str(cnt)
#print("ans is ",ans)
return ans
def getSequenceThe(start,num):
for _ in range(num):
start=theNextOne(start)
return start
x,y=input().split()
print(getSequenceThe(x,int(y)-1))
1088 三人行 (20 分)
7个点第6个过不了,数学思想,解出变量(使用循环看是否满足所有关于该变量的函数(一般都过换元消除了其他的变量))
#思路求出三个人的成绩,数据量较小直接比较
#和自己的分数比较
score_me,time1,time2=map(int,input().split())
if score_me>=100:
print("No Solution")
else:#求3个人的分数,先求甲的
max1,flag=0,False
for i in range(10,100):
if (time2+time1)*int(str(i)[::-1])/time2==i:
flag=True
max1=i
if (time2-time1)*int(str(i)[::-1])/time2==i:
flag=True
max1=i
#甲的值为i
if max1==0 and not flag:
print("No Solution")
else:
A,B=max1,int(str(max1)[::-1])
C=B/time2
print(A,end='')
for i in [A,B,C]:
if i>score_me:
print(' Cong',end='')#i是三人中的分数
elif i<score_me:
print(' Gai',end='')
else:
print(' Ping',end='')
print()
满分版本
get_index()函数对以后写法有指导意义
def main():
M, X, Y = (int(x) for x in input().split())
answer = 'No Solution'
# 先假设没有答案
compare = ['Ping', 'Gai', 'Cong']
# 待会用M 与甲乙丙三人的能力值制造对应的下标
for a in range(99, 9, -1):
# 甲就是a,从99到10尝试各种可能
flag, b, c = check(a, X, Y)
if flag:
# 找到第一个答案
answer = "{} {} {} {}".format(a, compare[get_index(M, a)], compare[
get_index(M, b)], compare[get_index(M, c)])
break
# 只需要一个甲取值最大的就可以了,记得break出去
print(answer)
# 输出答案
def get_index(a, b):
# 根据 M 和 甲乙丙的大小关系计算下标
if a == b:
# 对应compare[0] == 'Ping'
return 0
else:
# 对应compare[-1] == 'Gai' 和 compare[1] == 'Cong'
return int((a - b) / abs(a - b))
def check(a, X, Y):
# 判断 甲是a时,是否满足条件。
b = float(str(a)[::-1])
c = b / Y
# c 可能是一个浮点数,本题的一个坑点。
if abs(a - b) == X * c:
return (True, b, c)
else:
return (False, 0, 0)
if __name__ == '__main__':
main()
网友评论