20230411-赛码网刷题

文章包含两个编程题目。第一题涉及读取未给出行列数的矩阵并转置输出,采用Python实现。第二题是关于计算最少按键次数打出字符串,考虑CapsLock和Shift的切换,提供了两种解法。第三题是一个关于员工招聘的问题,目标是找出最多能录取多少名来自不同学校的学生。
摘要由CSDN通过智能技术生成
1.读取未给出行列数的矩阵

时间限制: 3000MS
内存限制: 589824KB
题目描述:
【输入问题】在考试时,有些时候没有给出数据的行数n,对于矩阵,可能行数n和列数m都未给出,本题就是为了训练这类题目的输入。(做题前可以先阅读:https://labfiles.acmcoder.com/ojhtml/index.html#/?id=%e6%b2%a1%e6%9c%89%e7%bb%99%e5%87%ba%e7%9f%a9%e9%98%b5%e7%9a%84%e8%a1%8c%e5%88%97%e6%95%b0)

对于给定的一个二维矩阵,请转置后进行输出。

#!/usr/bin/env python  
# coding=utf-8
arr = []
while 1:
  s = input()

  if s != "":
    arr.append(list(map(int, s.split())))
  else:
    break
    
n=len(arr)
m=len(arr[0])
for j in range(m):
    for i in range(n):
        print(arr[i][j],end=' ')
    print('\n')
2.打字

时间限制: 3000MS
内存限制: 589824KB
题目描述:
小明很喜欢打字,今天小红给了小明一个字符串。
这个字符串只包含大写和小写字母。
我们知道,按下CapsLock键,可以切换大小写模式。
我们在小写模式时候,同时按下shift+字母键,就能写出大写字母。
在大写模式的时候,按下shift+字母键,就能写出小写字母。
现在问题来了,给你一个字符串,问你最少使用多少个按键,就可以写出这个字符串呢?
注意,按shift和字母键,算两次按键。开始时均为小写状态。

样例输入
	3
	A
	AA
	AAAAAA
样例输出
	2
	3
	7

很奇怪,明明觉得自己思路都是对的,但为什么正确率只有9%啊?是哪里出了问题

def fun_3(s):
    flag=0 #表示此时属于小写状态
    cnt=0
    for i in range(len(s)):
        if s[i]>='A' and s[i]<='Z':
            if flag==0:
                if i+1<len(s):
                    if s[i+1]>='A' and s[i+1]<='Z':
                        cnt+=2
                        flag=1
                    else:
                        cnt+=2
                else:
                    cnt+=2
            else:
                cnt+=1
        elif s[i]>='a' and s[i]<='z':
            if flag==0:
                cnt+=1
            else:
                if i+1<len(s):
                    if s[i+1]>='a' and s[i+1]<='z':
                        cnt+=2
                        flag=0
                    else:
                        cnt+=2
                else:
                    cnt+=2
        else:
            cnt+=1

    return cnt

n=int(input())
for i in range(n):
    s=input()
    print(fun_3(s))

状态转移的写法

def fun(s):
    dp=[[0 for i in range(len(s))] for i in range(2)]
    for i in range(len(s)):
        if s[i]>='a' and s[i]<='z':
            if i==0:
                dp[0][i]=1
                dp[1][i]=2
            else:
                dp[0][i]=min(dp[0][i-1]+1,dp[1][i-1]+2)
                dp[1][i]=min(dp[0][i-1]+2,dp[1][i-1]+2)
        else:
            if i==0:
                dp[0][i]=2
                dp[1][i]=2
            else:
                dp[0][i]=min(dp[0][i-1]+2,dp[1][i-1]+2)
                dp[1][i]=min(dp[0][i-1]+2,dp[1][i-1]+1)
                
    for i in dp:print(i)
    return min(dp[0][-1],dp[1][-1])
3.Manager

时间限制: 3000MS
内存限制: 589824KB
题目描述:
小明是一个互联网公司的老板,需要招聘员工。现在有k个学校的学生前来应聘。

由于特殊原因,要求最后入职的员工学校的人数应该都不一样。

比如我们可以A大学录取5人,B大学录取4人。但是不允许A大学和B大学都录取5人。

请问最后最多录取多少人呢?
正确率67%,不知道为啥

n=int(input())
li=list(map(int,input().split()))
li.sort(reverse=True)
ans=li[0]
tmp=li[0]
for i in range(1,n):
    ans+=min(tmp-1,li[i])
    tmp=min(tmp-1,li[i])
    
print(ans)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值