python蓝桥杯7——子串分值、谈判、扫雷

子串分值

题目描述

对于一个字符串 S S S,我们定义 S S S 的分值 f ( S ) f(S) f(S) S S S 中恰好出现一次的字符个数。例如 f ( a b a ) = 1 f(aba) = 1 f(aba)=1 f ( a b c ) = 3 f(abc) = 3 f(abc)=3, f ( a a a ) = 0 f(aaa) = 0 f(aaa)=0

现在给定一个字符串 S 0 ⋯ n − 1 S_{0 \cdots n − 1} S0n1(长度为 n n n 1 ≤ n ≤ 1 0 5 1 \leq n \leq 10^5 1n105),请你计算对于所有 S S S 的非空子串 S i ⋯ j ( 0 ≤ i ≤ j < n ) , f ( S i ⋯ j S_{i \cdots j}(0 ≤ i ≤ j < n), f(S_{ i⋯j} Sij(0ij<n),f(Sij) 的和是多少。

输入描述

输入一行包含一个由小写字母组成的字符串 S S S

输出描述

输出一个整数表示答案。

输入输出样例

示例

输入

ababc

输出

21

代码演示

import os
import sys

# 请在此输入您的代码
from collections import deque
def remove_list(a, v):
    for i in range(len(a)):
        if a[i] == v:
            a[i] = None
    while None in a:
        a.remove(None)
    return a
        

def remove_1(a):
    seen = set()
    duplicated = set()
    for x in a:  
        if x not in seen:  
            seen.add(x)
        else:
            duplicated.add(x)
    for i in list(duplicated):
        remove_list(a, i)
        
    return len(a)


def child(s):
    new = []
    count = 0
    for i in range(len(s)):

        for j in range(len(s)-i):
            new.append(s[j:j+1+i])
        for var in new:
            count += remove_1(list(var))
        new.clear()
    return count

    



if __name__ == '__main__':
    s = input()
    print(child(s))

谈判

题目描述

在很久很久以前,有 n n n 个部落居住在平原上,依次编号为 1 1 1 n n n。第 i i i 个部落的人数为 t i t_i ti

有一年发生了灾荒。年轻的政治家小蓝想要说服所有部落一同应对灾荒,他能通过谈判来说服部落进行联合。

每次谈判,小蓝只能邀请两个部落参加,花费的金币数量为两个部落的人数之和,谈判的效果是两个部落联合成一个部落(人数为原来两个部落的人数之和)。

输入描述

输入的第一行包含一个整数 n n n,表示部落的数量。

第二行包含 n n n 个正整数,依次表示每个部落的人数。

其中, 1 ≤ n ≤ 1000 1 \leq n \leq 1000 1n1000 1 ≤ t i ≤ 1 0 4 1 \leq t_i \leq10^4 1ti104

输出描述

输出一个整数,表示最小花费。

输入输出描述

示例

输入

4
9 1 3 5

输出

31

代码演示

import os
import sys

# 请在此输入您的代码
def talk(data):
    data.sort()
    count = data[0] + data[1]
    sum1 = data[0] + data[1]
    for i in range(2, n):
        sum1 += data[i]
        count += sum1
    return count

if __name__ == '__main__':
    n = int(input())
    a = list(map(int, input().split()))
    print(talk(a))

扫雷

题目描述

在一个 n n n m m m 列的方格图上有一些位置有地雷,另外一些位置为空。

请为每个空位置标一个整数,表示周围八个相邻的方格中有多少个地雷。

输入描述

输入的第一行包含两个整数 n , m n, m n,m

2 2 2 行到第 n + 1 n+1 n+1 行每行包含 m m m 个整数,相邻整数之间用一个空格分隔。如果对应的整数为 0 0 0,表示这一格没有地雷。如果对应的整数为 1 1 1,表示这一格有地雷。

其中, 1 ≤ n , m ≤ 100 1 \leq n, m \leq 100 1n,m100 分钟后还是在当天。

输出描述

输出 n n n 行,每行 m m m 个整数,相邻整数之间用空格分隔。

对于没有地雷的方格,输出这格周围的地雷数量。对于有地雷的方格,输出 9 9 9

输入输出描述

示例

输入

3 4
0 1 0 0
1 0 1 0
0 0 1 0

输出

2 9 2 1
9 4 9 2
1 3 9 2

代码示例

direction = [
    lambda x, y: (x-1, y),# shang
    lambda x, y: (x+1, y), # xia
    lambda x, y: (x, y-1), # zuo
    lambda x, y: (x, y+1), # you
    lambda x, y: (x-1, y-1), # shang_zuo
    lambda x, y: (x-1, y+1), # shang_you
    lambda x, y: (x+1, y-1), # xia_zuo
    lambda x, y: (x+1, y+1)  # xia_you
]
def lei(data):
    for vs in data:
        for i in range(m):
            if vs[i] == 1:
                vs[i] = 9
    for i in range(n):
        for j in range(m):
            for dir1 in direction:
                nextNode = dir1(i, j)
                if data[i][j] == 9:
                    break
                if 0 <= nextNode[0] < n and 0 <= nextNode[1] < m:
                    if data[nextNode[0]][nextNode[1]] == 9:
                        data[i][j] += 1
                    

    return data

    

if __name__ == '__main__':
    n, m = map(int, input().split())
    a = []
    for i in range(n):
        v = list(map(int, input().split()))
        a.append(v)
    for i in lei(a):
        print(' '.join(map(str, i)))

你可能感兴趣的:(蓝桥杯,蓝桥杯,算法)