2020
回文日期
a=['01','02','03','04','05','06','07','08','09','10','11','12']
#注意这里都要写01.02等
b=['01','02','03','04','05','06','07','08','09','10','11','12','13','14','15','16','17','18','19','20','21','22','23','24','25',
'26','27','28','29','30','31']
s=[]
def run(i):
if int(i)%400==0 or int(i)%4==0 and (int(i)%100)!=0:
return True
else:
return False
small=['04','06','09','11']
big=['01','03','05','07','08','10','12']
for i in range(1000,9999):
if str(i)[::-1][:2] in a and str(i)[::-1][2:] in b:
s.append(str(i)+str(i)[::-1])
for i in s:#i 是string
if i[4:6]=='02':
if run(i) and int(i[6:])>29:
s.remove(i)
if run(i)==False and int(i[6:])>28:
s.remove(i)
if i[4:6] in small and int(i[6:])>30:
s.remove(i)
if i[4:6] in big and int(i[6:])>31:
s.remove(i)
n=int(input())
for i in s:
if int(i)>n:
print(i)
break
for i in s:
if int(i)>n and int(i[0:2])==int(i[2:4]) :
print(i)
break
1注意[:]是从头到尾输出字符串,[::1]最后一位是排序,1正-1倒
子串分值和
自己写的,通过遍历查找,30分,超时了
s=input()
ans=0
def count(str):
f=0
str=list(str)
arr=[[0 for i in range(len(str))] for j in range(len(str))]
for i in range(len(str)):
for j in range(len(str)):
if str[i]==str[j] :
arr[i][j]=1
for i in range(len(str)):
sum=0
for j in range(len(str)):
sum+=arr[i][j]
if sum==1:
f+=1
return f
for i in range(len(s)):
for j in range(i+1,len(s)+1):
ans+=count(s[i:j])
print(ans)
网上的解题思路:https://blog.csdn.net/weixin_45494989/article/details/123213139
代码(运行正确):
s=input()
c='a'
ans=0
while ord(c)<=ord('z'):
if c in s:
li=[]
li.append(-1)
for i in range(len(s)):
if s[i]==c:
li.append(i)
li.append(len(s))
for i in range(2,len(li)):
ans+=(li[i]-li[i-1])*(li[i-1]-li[i-2])
c=chr(ord(c)+1)
print(ans)
荒岛探测(几何)
题目比较难,没有思路,骗分(20分):
###是一道几何题目,看起来没啥思路,可以骗分
xa,ya,xb,yb,L=map(int,input().split())
x1,y1,x2,y2,x3,y3=map(int,input().split())
pi=3.1415926
def dis(xa,xb,ya,yb):
return ((xa-xb)**2+(ya-yb)**2)**0.5
def areatu(xa,xb,ya,yb):
a=L*1.0/2
c=((xa-xb)**2+(ya-yb)**2)**0.5/2
b=(a*a-c*c)**0.5
return pi*a*b
def areasan(x1,x2,x3,y1,y2,y3):
aa=dis(x1,x2,y1,y2)
bb=dis(x1,x3,y1,y3)
cc=dis(x2,x3,y2,y3)
p=(aa+bb+cc)/2
return (p*(p-aa)*(p-bb)*(p-cc))**0.5
if L<0: #① -1000<L<1000
print(0.00)
elif dis(xa,xb,ya,yb)>=L: #② 发射器和接收器的距离已经超过L
print(0.00)
elif dis(xa,x1,ya,y1)+dis(xb,x1,yb,y1)<=L and dis(xa,x2,ya,y2)+dis(xb,x2,yb,y2)<=L and dis(xa,x3,ya,y3)+dis(xb,x3,yb,y3)<=L:
#③三角形在椭圆里面
print('%.2f'%areasan(x1,x2,x3,y1,y2,y3))
else:
#④椭圆在三角形里面
print('%.2f'%areatu(xa,xb,ya,yb))
1注意输出的格式,这里要保留两位小数
第十届
修改数组(并查集)
遍历修改,超时,30分
n=int(input())
s=list(map(int,input().split()))
i=1
while i < len(s):
j=0
while j < i:
if s[i]!=s[j]:
j+=1
else:
s[i]+=1
j=0
i+=1
for i in range(len(s)):
print(s[i],end=' ')
网上别人的思路,利用并查集:
使用并查集的算法,先寻找A[i]的根节点root,将root加入到答案中,再让father[root]这个集合的值加一,这一步的意义是如果再次遇到之前遇到的数可以直接在最终的答案里写入 这个数根节点的值+1,即我们所求的值。这样循环往复,输入值之后就可以在最终的答案里加入正确的值。
n=int(input())
A=list(map(int,input().split()))
father=[i for i in range(1000000)] #range(n+1)只有80分
def find(x): #找x的祖先节点
if x!=father[x]:
#如果x的祖先节点不是自己,则是祖先的祖先,直接找到最终的祖先:1->2->3->4
father[x]=find(father[x])
return father[x]
for i in range(n):
root=find(A[i])
A[i]=root
father[root]=root+1
for i in range(n):
print(A[i],end=' ')