描述
小明是一个互联网公司的老板,需要招聘员工。现在有k个学校的学生前来应聘。
由于特殊原因,要求最后入职的员工学校的人数应该都不一样。
比如我们可以A大学录取5人,B大学录取4人。但是不允许A大学和B大学都录取5人。
请问最后最多录取多少人呢?
输入描述
第一行一个整数k,表示学校的数量。
第二行k个整数ai,表示这个学校有ai个人前来应聘。
满足 1<=k<=100000,1<=ai<=100000
输出描述
输出最多录取人数
示例
输入
3
3 3 2
输出
6
朴素的想法:遍历每一个数字,如果这个数字已经存在,从大到小遍历到不存在的。
nums=int(input())
points = list(map(int, input().split()))
sum=0
add=[]
for n in points:
if n in add:
n_new = n-1
while n_new in add:
n_new -=1
sum+=n_new
add.append(n_new)
else:
sum+=n
add.append(n)
print(sum)
但是这个朴素想法有一个 num=100000 的例子通不过,时间超时了。
找到一个想法更好的,先从大到小sort,然后以目前的值作为bound。可惜的是同样超时
超时估计是因为循环的问题
就想一开始把 points 分成 unique 和 remain 两部分,然后循环 remain 的部分。但是好像很难不遍历就得到这两部分。依旧超时的代码如下:
nums=int(input())
points = list(map(int, input().split()))
unique = list(set(points))
res = sum(unique)
if len(unique) != len(points):
[points.remove(i) for i in unique]
remain = points
for n in remain:
n_new = n-1
while n_new in unique:
n_new-=1
res+=n_new
unique.append(n_new)
print(res)
所以最后还是遍历了所有的数值。。。
无能为力了,再见。今日python 失败。
描述
小明很喜欢打字,今天小红给了小明一个字符串。
这个字符串只包含大写和小写字母。
我们知道,按下CapsLock键,可以切换大小写模式。
我们在小写模式时候,同时按下shift+字母键,就能写出大写字母。
在大写模式的时候,按下shift+字母键,就能写出小写字母。
现在问题来了,给你一个字符串,问你最少使用多少个按键,就可以写出这个字符串呢?
注意,按shift和字母键,算两次按键。开始时均为小写状态。
输入描述
第一行一个T,表示有T组输入。
接下来T组数据:
每组数据一个字符串s,s的长度小于等于100。仅包含大小写字母。
输出描述
对于每组数据,输出最少按键次数。
示例
输入
3
A
AA
AAAAAA
输出
2
3
7
方法: 如果当前字母与现在状态一致,那只需要一次按键。但如果状态不一致的时候,需要两次按键。但是考虑是否要切换大小写,需要考虑下一个字母是不是跟当前字母是同样的状态。例如‘Aa’,状态是小写时,不切换的按键数量是3,切换的话按键数量是4。
判断字符是全是数字or字母
string和list之间互换
另外,如果是最后一个字母,其实不需要考虑切换的问题了,但是为了代码的完整性,人为增加了最后一个字符。但其实他是大写or小写不太重要。
num = int(input())
for i in range(num):
alphabet = list(','.join(input().split()))
state=0 # 状态是0的时候是小写,状态时1的时候是大写
res=0
if ''.join(alphabet).isdigit():#明明说只有字母,但是检测的时候出现了数字,很无语
res = len(alphabet)
else:
for j in range(len(alphabet)):
ele = ''.join(alphabet[j])
if j<len(alphabet)-1:
ele_next = ''.join(alphabet[j+1])
else:
ele_next = 'a' #表示是最后一个
if (ele.islower() and state==0) or (ele.isupper() and state==1):
res+=1
elif (ele.islower() and state==1):
if ele_next.islower():
state = 0 # 后一个也是一样的大小写的时候,切换大小写
res+=2 # 如果后一个不是一样的大小写,就按shift,但是同样需要两次。同时如果是最后一字母,同样也是需要两次
elif (ele.isupper() and state==0):
if ele_next.isupper() :
state = 1
res+=2
print(res)
感觉别人的比我更简洁,学习!可以直接用 True or False 作为状态标识
参考后,修改如下
num = int(input())
for i in range(num):
alphabet = ','.join(input().split())
state=True # 状态是0的时候是小写,状态时1的时候是大写
res=0
if alphabet.isdigit():
res = len(alphabet)
else:
for j in range(len(alphabet)):
ele = alphabet[j]
if j<len(alphabet)-1:
ele_next = alphabet[j+1]
else:
ele_next = 'a' #表示是最后一个
if ele.islower() == state:
res+=1
else:
if ele_next.islower() == ele.islower():
state = not state # 后一个也是一样的大小写的时候,切换大小写
res+=2 # 如果后一个不是一样的大小写,就按shift,但是同样需要两次。同时如果是最后一字母,同样也是需要两次
print(res)
今日python 半成功(o゜▽゜)o☆
描述
花花有一个很珍贵的数字串,但是它太长了,没有办法保留下来,所以她想截取其中一段保存下来,但是她希望截取下来的这一段数对1000000007取模之后等于Ai,她想知道有多少种截取方案。数字串S中截取一段是指S[L], S[L+1], …, S[R]连起来所形成的十进制数,其中L和R满足1≤L≤R≤|S|。例如S=“1023456789”,S(1,2)=10,S(2,4)=23,S(2,10)=23456789。
输入描述
第一行一个数字串,长度不超过30000。
第二行一个数T,表示询问的数量。(T≤100)
接下来T行,每行一个非负整数Ai,表示询问有多少种截取方案使得其值模1000000007后等于Ai。(0≤Ai<1000000007)
输出描述
共T行,每行一个非负整数,表示方案数。
示例
输入
1000000008001
4
8
0
1
10
输出
9
39
5
2
初次尝试的代码如下。python的向量运算真的不太行 list(A)+list(B) 竟然不是A B各元素相加。。。可以运行,但是到第四题的时候出现了运行时间过长的问题。
numlst=list(','.join(input().split()))
num = int(input())
deter = []
def Judge(q,deter,res):
ans = [0]*len(deter)
qmob = q % 1000000007
for i in range(len(deter)):
if qmob==deter[i]:
ans[i]=1
res = [res[i]+ans[i] for i in range(len(deter))]
return res
for i in range(num):
deter.append(int(input()))
length = len(numlst)
res=[0]*num
for i in range(length-1):
res = Judge(int(numlst[i]),deter,res)
for step in range(length-i-1):
n = int(''.join(numlst[i:i+step+2]))
res = Judge(n,deter,res)
res=Judge(int(numlst[-1]),deter,res)
for i in range(num):
print(res[i])
问了问chatgpt,我的想法还是太朴素了。可以用数学的想法,每次原有值*10,加上后面list的值。
numlst=list(','.join(input().split()))
num = int(input())
deter = []
mod_val = 1000000007
def Judge(qmob,deter,res):
ans = [0]*len(deter)
qmob %= mod_val
for i in range(len(deter)):
if qmob==deter[i]:
ans[i]=1
res = [res[i]+ans[i] for i in range(len(deter))]
return res
for i in range(num):
deter.append(int(input()))
length = len(numlst)
res=[0]*num
for i in range(length):
current_num = 0
for j in range(i, length):
current_num = current_num * 10 + int(numlst[j])
res = Judge(current_num, deter,res)
for i in range(num):
print(res[i])
但是时间还是超时了。找不到一点办法 T-T
描述
在Z省,有若干个个城市坐落在一条直线上,从左到右依次标号1,2,3,…,其中每个城市有一个火车站点,现今已经开放了n条火车路线,第i条火车路线是从第Yi个城市到第Xi个城市,因为Z省地势奇特,标号小的城市地势较低,所以火车是从高往低开的,再通过神秘力量传送回高地,即Yi一定大于Xi,它在沿途的所有城市都会停靠(显然不包括起点Yi,但是包括终点Xi),火车停靠就需要火车站台来运营维护。火车站台随着运营线路的数量不同,其损耗速度、维护成本也各异,现在我们想知道所有站台中,所运营的线路数最大是多少。
输入描述
第一行一个数n。(1≤n≤100000)
接下来n行每行两个数Xi和Yi,分别代表第i条火车路线的终点和起点。(1≤Xi 输出描述 时间不过,让我来研究一下【线段树】再回来。
共一行,一个非负整数,表示最大运营路线数。
示例输入
4
4 7
2 6
2 5
1 2
输出
3
num = int(input())
rt=[]
count=[]
for i in range(num):
rt.append(list(map(int,input().split())))
if rt[i][1]>len(count):
count = count+[0]*(rt[i][1]-1-len(count))
count[rt[i][0]-1:rt[i][1]-1] = [j+1 for j in count[rt[i][0]-1:rt[i][1]-1]]
res=max(count)
print(res)