1.24牛客周赛

第一题:小红大战小紫

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

小红正在和小紫对战,给定两个人的胜场数量,请你判断最终是谁获胜了。

输入描述:

两个正整数a,b用空格隔开。a代表小红的胜场,b代表小紫的胜场。
1≤a,b≤109

输出描述:

如果小红获胜了,请输出"kou"。如果小紫获胜了,请输出"yukari"。如果最终平局,请输出"draw"。

示例1

输入

3 1

输出

kou

示例2

输入

114514 114514

输出

draw
a,b =input().split(' ')
#复习点1
#开始时直接是int(a) int(b) 这是错误的!
#int()函数不会改变原数据类型,而是返回一个新的数据(新内存空间)
a=int(a)
b=int(b)
#复习点2
#这里用if elif else ;而不是用多个if目的有二
#1【if elif else 分情况时连用可以简化代码书写】
#2【可减少搜索所消耗的计算资源,多级判断只需对剩余搜索空间搜索即可】

if a==b:
    print("draw\n")
elif a>b:
    print("kou\n")
else:
    print("yukari")

第二题:小红的白日梦

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

小红经常会做梦,但她比较喜欢做白日梦。
已知小红白天做梦可以获得 2 点幸福度,晚上做梦可以获得 1 点幸福度。现在给定小红每天中午和晚上睡觉的做梦情况。她可以每天将晚上的梦提前移到白天来做,请问小红总共最多可以获得多少幸福度?
注:只有当白天没做梦且晚上做梦的时候才可以移动梦境。

输入描述:

第一行输入一个正整数n,代表总天数。
第二行输入一个长度为n的、仅由'Y'和'N'组成字符串,代表每天中午的做梦情况。
第二行输入一个长度为n的、仅由'Y'和'N'组成字符串,代表每天晚上的做梦情况。
'Y'代表做梦了,'N'代表没做梦。
1≤n≤105

输出描述:

一个整数,代表最多的幸福度。

示例1

输入

4
NNNN
NNNN

输出

复制0

 

说明

小红一个梦都没做,最终幸福度为 0。
n= int(input())#记录天数总数
       
Noon = [i for i in input()]
Night = [i for i in input()]
       
#用Noon、Night列表记录睡眠数据

welling = 0#初始化幸福指数

for t in range(n):#这里定义一个临时变量存储每日的索引
    
    #搜索每日的睡眠数据
    
        #先看看是不是特殊情况
    if (Noon[t]=="N")and (Night[t]=="Y"):
        welling+=2
        
        #如果不是就意味着不可改变做梦时段
    else:
            #对(中、晚)的信息检测统计即可
        if Noon[t]=="Y":
            welling+=2
        if Night[t]=="Y":
            welling+=1
print(welling)

第三题:小红的小小红

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
Special Judge, 64bit IO Format: %lld

题目描述

小红拿到了一个字符串,其中一定包含连续子串"xiao",和连续子串"hong"。
请你将字符串重排,使得该字符串包含"xiaohong"的连续子串。

输入描述:

输入一个仅包含小写字母的字符串,长度不超过10^5
保证字符串一定包含"xiao"子串和"hong"子串。

输出描述:

重排后的字符串。有多解时输出任意即可。

示例1

输入

honghongxiao

输出

xiaohonghong

示例2

输入

xaohonghonxiao

输出

xaoxiaohonghon

        

string = input()
Ord_Str = string
#输出的串只要是不和原串一样就行

#在原串中找"xiao"子串,找到一个之后删除,修改的结果存储在string中
string = string.replace("xiao","",1)
#类似找"xiao",找"hong"
string = string.replace("hong","",1)
#都找到之后将他们“提出来”方法是将他们分别在原串中删除
#题目要求决定了该删除操作一定成功


#我们选择一个输出方式,但前提是不能和原串一样
#这里可以用“是0则1是1则0 保异”的方式确保前不等于后
if Ord_Str != string+"xiaohong":
    print(string+"xiaohong")
else:
    print("xiaohong"+string)

第四题:小红的中位数

链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
 

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

小红拿到了一个数组:a1,a2,...,an。她定义 f(i) 为,删除第iii个元素后,数组的中位数。现在小红想让你求出f(1),f(2)...f(n)的值,你能帮帮她吗?

输入描述:

第一行输入一个正整数n,代表数组的大小。
第二行输入n个正整数ai​,代表数组的元素。
2≤n≤105
1≤ai≤109

输出描述:

输出n行,每行输出一个浮点数,第i行代表f(i)的值。保留一位小数。

示例1

输入

4
2 5 8 1

输出

5.0
2.0
2.0
5.0

示例2

输入

3
1 2 3

输出

2.5
2.0
1.5
import copy
def med (x:int,ar:list):#定义求中位数函数
  
    Arr = copy.deepcopy(ar)#先声明一个数组的副本
    #这里将会消耗一些时间,大约是O(n)
    

    #这里把副本目标元素删除了
    Arr.remove(x)
    
   #然后在这里对删除后的数组进行"快排"大约是(n*logn -> n^2)

    Arr = sorted(Arr)
    
    

    #接下来对几个数据进行判断处理,时间复杂度是常量级的因此是O(1)
    #START
    if len(Arr)%2 ==0:
        a = Arr[int((len(Arr)/2)-1)]#len 函数会读取对象预定义好的len数据,因此时间复杂度是O(1)
        b = Arr[int((len(Arr)/2))]
        re = (a+b)/2

        
       
    else:
        re = Arr[int(((len(Arr)+1)/2)-1)]
    #OVER
    print(f'{re:.1f}')
   





n = int(input())

#通过列表存储输入数据,其时间复杂度是O(n)
arr = [int(i)for i in input().split(" ")]

for i in range(n):
    #这里循环遍历并调用函数,时间复杂度应为O(n*time(med))
    med(arr[i],arr)
    


#到这时间复杂度应约为O(n+n*(n+n^2))≈O(n^3)

这种方法时间复杂度达到了O(n^3)案例只通过30%

看来要优化一下了!!

旧思路:

·对每一个元素删除的列表结果进行遍历寻找,

        “遍历”是n

        "寻找过程"包括"排序"(最复杂复杂度部分)是O(n^{2})

                嵌套后应该是O(n^{3})

新思路:

        排序大概率无法避免,那遍历能不能优化呢?

                遍历被优化,理想为O(1),这说明了,排序只需排一次,遍历被优化成“常量级”

                        ·对要删除的元素位置进行分类讨论,获得中位数结果

                                优化后应该是O(n^{2})


def med (x:int):#定义求中位数函数
    #如果数组元素数量是奇数:
            #要删除的元素在"左"--->med = (list[l+1]+list[x+2])/2
            #要删除的元素在"中"--->med = (list[m-1]+list[x+1])/2
            #要删除的元素在"右"--->med = (list[r-2]+list[x-1])/2

    if len(arr)%2==1:
        
     
        if x <= int(((len(arr)-1)/2)-1):
            re = (arr[int(((len(arr)-1)/2))]+arr[int(((len(arr)-1)/2)+1)])/2
        elif x == int(((len(arr)+1)/2)-1):
            re = (arr[x-1]+arr[x+1])/2
        else:
            re = (arr[int(((len(arr)-1)/2)-1)]+arr[int(((len(arr)-1)/2))])/2
    #后面做类似以上的讨论
    #如果数组元素数量是偶数:
            #要删除的元素在"左"--->med = list[l+1]
            #要删除的元素在"右"--->med = list[r-1]
    else:
        if x<= int((len(arr)/2)-1):
            re = arr[int((len(arr)/2))]
        else:
            re = arr[int((len(arr)/2)-1)]
    print(f'{re:.1f}')
        

n = int(input())







#通过列表存储输入数据,其时间复杂度是O(n)
arr = [int(i)for i in input().split(" ")]


#下面有点绕。。。。

#我们要通过存储原序列下标关键字存储其元素信息
#将找到的元素信息作为关键字找到排序后的元素下标信息

#这两个字典生成式时间复杂度O(2n)


#->以便以原序列顺序进行"删除元素操作"

dic= {ind:i for ind,i in enumerate(arr)}

#这里先记录一下元素没排序的位置

arr.sort()
di ={i:ind for ind,i in enumerate(arr)}

for i in range(n):
    

    med(di[dic[i]])
    
#总地来看,时间复杂度为O(n^2+n)≈O(n^2)

        这个解是能通过题目的

  • 25
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值