江苏初中课程基地建设网站,泊头做网站价格,微信小程序展示网站建设多少钱,增城新塘网站建设ACWING寒假每日一题
一、孤独的照片 一个点一个点的来看#xff0c;比如对于GHGHG中间的G#xff0c;找到他的左边的G#xff0c;以及右边的G的位置#xff0c;l,r分别等于1#xff0c;答案就要多加上11 但是如果对于 GHHGHHG 中间的G#xff0c;我们可以看到l,r等于2比如对于GHGHG中间的G找到他的左边的G以及右边的G的位置l,r分别等于1答案就要多加上11 但是如果对于 GHHGHHG 中间的G我们可以看到l,r等于2那么就一个中间G的对于他的左半边来说能拍l-1张照片右半边也是能拍r-1张之后左右一起看的话能拍lr张。 知道这个就好做了我们只需要把每个G和H点的坐标存起来然后遍历一编就行了不过要注意边界例如对于第一个G点他的l是等于他的坐标的那么我们只需要把G[0]设置为-1这样计算l的时候就会等于G[1]l g[i] - g[i-1] -1
具体代码如下
n int(input())
s input()
res 0
g,h [-1],[-1] # 第一个点 h[1] - h[1-1]-1 就是h[1]
for i in range(n):if s[i] G:g.append(i) # 记录G的位置else:h.append(i) # H的位置
g.append(n) # 处理右边界 最后一个点 h[i1]-h[i]-1
h.append(n)
for i in range(1,len(g)-1):l g[i] - g[i-1] - 1 r g[i1] - g[i] - 1if l 2:res l-1if r 2:res r-1res r*l
for i in range(1,len(h)-1):l h[i] - h[i-1] - 1 r h[i1] - h[i] - 1if l 2:res l-1if r 2:res r-1res r*lprint(res)二、统计次数 对于python来说并不难我们有count函数其他语言我就不知道了On时间复杂度
代码如下
n,k map(int,input().split())
res 0
for i in range(1,n1):i str(i)k str(k)res i.count(k)
print(res)三、上课睡觉 对于每组数据我们从大到小遍历堆数就是总共要合成成几堆假设为K堆那么我们需要的操作就是n-k,因为k从大到小所以我们找到的一定是操作数最少的。 假设分为k堆首先要判断总数sum % k 是否等于0如果不等于代表他不能被k等分就不行 如果可以的话因为只有相邻的合并所以我们从小到大遍历石堆设置一个遍历m m 去 w[i],w为石堆然后如果等于 sum // k 就让m归0继续往下找如果msum//k 那就肯定不行了然后最后如果m 0 代表最后合成的一堆也等于 sum // k 就成功拉。
PS可能说的有点乱总的来说就是需要遍历石堆里的然后从头到尾合并都合并成sum//k如果合并着合并着发现大于sum//k了那就肯定不行了因为你如果舍弃掉开头那个就算你这堆可以等于sum//k但是你开头那个就没办法和别的石子合并了。因为这堆的开头的那个石子的前面要么没石头要么它的前面已经合并为sum//k了。
#### 代码如下def solve(w,cnt,totle):if totle % cnt ! 0: return False# 如果总数不能除尽堆数证明这个堆数是不可能的k totle // cntm 0for i in range(len(w)):m w[i]if m k : return Falseif m k : m 0return m 0 # 如果最后面刚好最后一堆的总和也等于平均数就返回Trueif __name__ __main__:t int(input())for i in range(t):n int(input())w [int(x) for x in input().split()]totle sum(w)for cnt in range(n,0,-1) : # 遍历堆数 就是要多最多的堆if solve(w,cnt,totle) : print(n - cnt) # 例如5堆最后分为3堆就要操作5-2次break四、学分绩点 这题也是比较暴力的题就没什么好说的
代码如下
if __name__ __main__:n int(input())xuefen [int(x) for x in input().split()]scores [int(x) for x in input().split()]res 0for i in range(n):if scores[i] 90:res xuefen[i] * 4.00elif scores[i] 85:res xuefen[i] * 3.7elif scores[i] 82:res xuefen[i] * 3.3elif scores[i] 78:res xuefen[i] * 3.0elif scores[i] 75:res xuefen[i] * 2.7elif scores[i] 72:res xuefen[i] * 2.3elif scores[i] 68 :res xuefen[i] * 2.0elif scores[i] 64:res xuefen[i] * 1.5elif scores[i] 60:res xuefen[i] * 1.0else: res 0print({:.2f}.format(res/sum(xuefen)))五、奶牛大学 将每头奶牛愿意出的学费给排序一下然后一个个去遍历以第一个第二个…作为学费找到最大值用enumerate就会很方便例如以第三头牛的愿意出的最大价格做学费sum 学费 *n-i 。如果有重复的不用担心例如愿意出的最大价格排好序后是 1 3 3 3 … 那么在计算第一个3的时候就是学费为3的能赚到钱的最大值后面两个不会覆盖掉第一个3
代码如下
if __name__ __main__:n int(input())s [int(x) for x in input().split()]s.sort()maxsum 0finalmoney 0for i,money in enumerate(s):sum money * (n-i)if summaxsum:maxsum sumfinalmoney moneyprint(maxsum,finalmoney)六、选数异或 直接暴力的话肯定会TLE的我们先预处理一个数组 maxl maxl[i] 代表右边界为i 能容忍的左边界最大是多少如果最后 l maxl[r] 就 say no 了 因为你比我能容忍的最大还大。 那要怎么算这个maxl呢首先如果第i个数的异或x的值假设为bmaxl[i - 1] 表示前一个位置能容忍的最大值那么maxl[i] 是不是要等于 max( maxl[i-1] , b的最后一个位置)。 那么我们现在只需要算出前面出现过的数的最后一个位置就行了再建立一个endpos表示每个数的最后一个位置。在遍历的时候让endpos[arr[i]] i 就行arr为原数组 又因为l和r是从1开始的所以我们的原始数组arr应该也从坐标1开始在第一个位置上加个-1就行。
具体代码如下
## a ^ b x -- a ^ x b
N 10**7
if __name__ __main__:n,m,x map(int,input().split())endpos [-1] * Narr [-1][int(x) for x in input().split()]maxl [-1] * (n2)for i in range(1,n1):# 对于每个位置来说他能容许的左边的最大值l 不能比这个再大了可以在它的左边是 maxl[i - 1] 或者 它目前这个位置的数异或值的最后一个位置maxl[i] max(maxl[i-1] , endpos[arr[i]^x]) # arr[i] ^ x 是你这个点想要的那个b arr[i] ^ b x,endpos[b] 就表示b出现的最后位置endpos[arr[i]] i # 记录一下每个数字出现的最后位置每个重复数字都记录的是后面那个数字的下标for i in range(m):l,r map(int,input().split())if (l ! r and maxl[r] l):print(yes)else: print(no)