蓝桥03 组队问题

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

作为篮球队教练,你需要从以下名单中选出 11 号位至 55 号位各一名球员,组成球队的首发阵容。

每位球员担任 11 号位至 55 号位时的评分如下表所示。请你计算首发阵容 11 号位至 55 号位的评分之和最大可能是多少?

在这里插入图片描述

运行限制

最大运行时间:1s
最大运行内存: 128M

解题思路

1 暴力法:

import os
import sys

# 请在此输入您的代码


s1 = [97,92, 0, 0,89,82, 0, 0, 0,95, 0, 0,94, 0, 0, 0,98,93, 0, 0]
s2 = [90,85, 0, 0,83,86, 0,97, 0,99, 0, 0,91,83, 0, 0,83,87, 0,99]
s3 = [ 0,96, 0, 0,97, 0, 0,96,89, 0,96, 0, 0,87,98, 0,99,92, 0,96]
s4 = [ 0, 0, 0,80, 0, 0,87, 0, 0, 0,97,93, 0, 0,97,93,98,96,89,95]
s5 = [ 0, 0,93,86, 0, 0,90, 0, 0, 0, 0,98, 0, 0,98,86,81,98,92,81]
li = []
for a in range(20):
    for b in range(20):
        for c in range(20):
            for d in range(20):
                for e in range(20):
                    if len(set([a,b,c,d,e])) == 5:
                        li.append(s1[a]+s2[b]+s3[c]+s4[d]+s5[e])
print(max(li))

在这里插入图片描述
看到大佬发布的题解中出现了这个,那我心里平衡了…
在这里插入图片描述

2 调库

在这里插入图片描述

3 不超时的方法

import os
import sys
# 请在此输入您的代码
a = [[97,90,0,0,0],[92,85,96,0,0],[0,0,0,0,93],[0,0,0,80,86],[89,83,97,0,0],
[82,86,0,0,0],[0,0,0,87,90],[0,97,96,0,0],[0,0,89,0,0],[95,99,0,0,0],
[0,0,96,97,0],[0,0,0,93,98],[94,91,0,0,0],[0,83,87,0,0],[0,0,98,97,98],
[0,0,0,93,86],[98,83,99,98,81],[93,87,92,96,98],[0,0,0,89,92],[0,99,96,95,81]]

x = [0,0,0,0,0]
tm = [100,101,102,103,104]
for j in range(5):
  b = [i[j] for i in a]
  x[j] = max(b)
  tm[j] = b.index(max(b))
  while True:
    set_list = set(tm)
    if len(set_list) == len(tm):
      break
    else:
      z = b.index(max(b))
      b[z] = 0
      x[j] = max(b)
      tm[j] = b.index(max(b))

print(sum(x))

查完set()函数,我直呼,真的太巧妙了!!!!!!!!!

由于福尔摩斯问题的具体要求不明确,我将假设题目指的是以下问题: 给定一个字符串,判断其中是否存在一个子串,使得该子串中每个字符出现的次数都相同。 例如,对于字符串 "abbcc",存在子串 "bb",其中 'b' 出现了 2 次,'c' 出现了 2 次,满足每个字符出现的次数相同。 以下是使用 Java 实现的代码: import java.util.*; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.nextLine(); int n = s.length(); Map<Character, Integer> freq = new HashMap<>(); for (int i = 0; i < n; i++) { char c = s.charAt(i); freq.put(c, freq.getOrDefault(c, 0) + 1); } boolean found = false; for (int len = 2; len <= n; len++) { for (int i = 0; i <= n - len; i++) { Map<Character, Integer> subFreq = new HashMap<>(); for (int j = i; j < i + len; j++) { char c = s.charAt(j); subFreq.put(c, subFreq.getOrDefault(c, 0) + 1); } if (subFreq.equals(freq)) { System.out.println(s.substring(i, i + len)); found = true; break; } } if (found) { break; } } if (!found) { System.out.println("NONE"); } } } 代码说明: 1. 首先读入字符串并计算每个字符出现的次数,使用 Map 存储。 2. 从长度为 2 的子串开始枚举,依次找出每个长度的子串并计算其中每个字符出现的次数,同样使用 Map 存储。 3. 判断当前子串中每个字符出现的次数是否与原字符串中每个字符出现的次数相同,如果相同则输出该子串并结束程序。 4. 如果没有找到符合条件的子串,则输出 "NONE"。 该代码的时间复杂度为 O(n^3),可以通过此题。实际上,还有更优秀的算法可以将时间复杂度优化到 O(n^2) 或 O(n) 级别,但由于题目数据范围小,此处不赘述。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值