洛谷基础题练习14

CSDN话题挑战赛第2期
参赛话题:学习笔记

1. 哥德巴赫猜想

题目描述

输入一个偶数 N,验证 4~N 所有偶数是否符合哥德巴赫猜想:任一大于 2 的偶数都可写成两个质数之和。如果一个数不止一种分法,则输出第一个加数相比其他分法最小的方案。例如 10,10=3+7=5+5,则 10=5+5 是错误答案。

输入格式

第一行输入一个正偶数 N(4 ≤ N ≤ 10000)

输出格式

输出
N − 2 2 \dfrac{N-2}{2} 2N2
行。对于第 i 行:

首先先输出正偶数 2i+2,然后输出等号,再输出加和为 2i+2 且第一个加数最小的两个质数,以加号隔开。

样例输入

10

样例输出

4=2+2
6=3+3
8=3+5
10=3+7
import math


def is_prime(num):
    """判断是否是素数"""
    if num == 1:
        return False
    k = int(math.sqrt(num))
    for i in range(2, k + 1):
        if num % i == 0:
            return False
    return True


n = int(input().strip())
for num in range(4, n+1, 2):
    for i in range(2, num):
        if is_prime(i) and is_prime(num - i):
            print(f'{num}={i}+{num-i}')
            break

2. HYX玩卡片

题目描述

HXY得到了一些卡片,这些卡片上标有数字 0 或 5 。现在她可以选择其中一些卡片排成一列,使得排出的一列数字组成的数最大,且满足被 90 整除这个条件。同时,这个数必须为合法的某个非负整数,即不能含有前导 0,即 0 不能作为这串数的首位。但是特殊地,整数 0 满足条件。如果不能排出这样的数,输出“-1”。

输入格式

第一行,卡片的个数 n(n ≤ 1000)。

第二行,分别给出了这 n 个数(只能为数字 5 或 0)。

输出格式

仅一行,如果可以排出,则输出这个数。否则输出-1

样例输入 #1

4
5 0 5 0

样例输出 #1

0

样例输入 #2

11
5 5 5 5 5 5 5 5 0 5 5

样例输出 #2

5555555550

样例输入 #3

2
5 5

样例输出 #3

-1
n = int(input().strip())
nums = [int(i) for i in input().strip().split()]
# 不包含0的肯定不满足条件
if nums.count(0) == 0:
    print(-1)
else:
    # 统计5的个数
    count_5 = nums.count(5)
    # 统计0的个数
    count_0 = nums.count(0)
    # print(count_5)
    if count_5 >= 9:
        # 有多少组 9个5
        k = count_5 // 9
        max_num = '5' * (9 * k) + '0' * count_0
        print(max_num)
    else:
        print(0)

3. Bookshelf B(奶牛叠罗汉)

题目描述

Farmer John最近为奶牛们的图书馆添置了一个巨大的书架,尽管它是如此的大,但它还是几乎瞬间就被各种各样的书塞满了。现在,只有书架的顶上还留有一点空间。

所有 N(1≤N≤20,000) 头奶牛都有一个确定的身高 Hi(1≤Hi≤10,000)。设所有奶牛身高的和为S书架的高度为B,并且保证 1≤BS<2,000,000,007。

为了够到比最高的那头奶牛还要高的书架顶,奶牛们不得不像演杂技一般,一头站在另一头的背上,叠成一座“奶牛塔”。当然,这个塔的高度,就是塔中所有奶牛的身高之和。为了往书架顶上放东西,所有奶牛的身高和必须不小于书架的高度。

显然,塔中的奶牛数目越多,整座塔就越不稳定,于是奶牛们希望在能够到书架顶的前提下,让塔中奶牛的数目尽量少。 现在,奶牛们找到了你,希望你帮她们计算这个最小的数目。

输入格式

  • 第 1 行: 2 个用空格隔开的整数:N 和 B;
  • 第 2~N+1 行: 第 i+1 行是 1 个整数:Hi

输出格式

  • 第 1 行: 输出 1 个整数,即最少要多少头奶牛叠成塔,才能够到书架顶部

样例输入

6 40
6
18
11
13
19
11

样例输出

3
N, B = map(int, input().strip().split())
H = []
for i in range(N):
    h_i = int(input().strip())
    H.append(h_i)
# 降序排序
H = sorted(H, reverse=True)
count = 0
S = 0
for num in H:
    if S < B:
        S += num
        count += 1
print(count)

4. 数字直角三角形

题目描述

给出 n,请输出一个直角边长度是 n 的数字直角三角形。所有数字都是 2 位组成的,如果没有 2 位则加上前导 0。

输入格式

输入一个正整数 n(1≤n≤13)。

输出格式

输出如题目要求的数字直角三角形。

样例输入

5

样例输出

0102030405
06070809
101112
1314
15
n = int(input().strip())
if 1 <= n <= 13:
    sum = 0
    for i in range(n, 0, -1):
        print(''.join(['{:02d}'.format(sum + j) for j in range(1, i+1)]))
        sum += i

5. 求三角形

题目描述

模仿例题,打印出不同方向的正方形,然后打印三角形矩阵。中间有个空行。

输入格式

输入矩阵的规模,不超过 9。

输出格式

输出矩形和正方形

样例输入

4

样例输出

01020304
05060708
09101112
13141516

      01
    0203
  040506
07080910
n = int(input().strip())
if 1 <= n <= 9:
    # 输出矩阵
    sum = 0
    for i in range(n):
        print(''.join(['{:02d}'.format(sum + j) for j in range(1, n+1)]))
        sum += n
    print()
    # 输出三角形
    sum = 0
    for i in range(1, n+1):
        print('  '*(n-i)+''.join(['{:02d}'.format(sum + j) for j in range(1, i+1)]))
        sum += i

6. 旗鼓相当的对手

题目描述

现有 N 名同学参加了期末考试,并且获得了每名同学的信息:语文、数学、英语成绩(均为不超过 150 的自然数)。如果某对学生 每一科成绩的分差都不大于 5,且总分分差不大于 10,那么这对学生就是“旗鼓相当的对手”。现在想知道这些同学中,有几对“旗鼓相当的对手”?同样一个人可能会和其他好几名同学结对。

输入格式

第一行一个正整数 N(2≤N≤1000)。

接下来 N 行,每行三个整数,其中第 i 行表示第 i 名同学的语文、数学、英语成绩。最先读入的同学编号为 1。

输出格式

输出一个整数,表示“旗鼓相当的对手”的对数。

样例输入 #1

3
90 90 90
85 95 90
80 100 91

样例输出 #1

2
#include 
#include 

struct Student
{
	int chinese;
	int math;
	int english;
	int total;
};

int main()
{
	int n, i, j, count=0;
	scanf("%d", &n);
	struct Student stu[n];
	for (i=0; i<n; i++)
	{
		scanf("%d %d %d", &stu[i].chinese, &stu[i].math, &stu[i].english);
		stu[i].total = stu[i].chinese + stu[i].math + stu[i].english;
	}
	
	for (i=0; i<n-1; i++)
	{
		for (j=i+1; j<n; j++)
		{
			int c, m, e, t;
			// 计算每一科的分差(绝对值) 
			c = abs(stu[i].chinese - stu[j].chinese);
			m = abs(stu[i].math - stu[j].math);
			e = abs(stu[i].english - stu[j].english);
			// 计算总分的分差(绝对值) 
			t = abs(stu[i].total - stu[j].total);
			if (c <= 5 && m <= 5 && e <= 5 && t <= 10)
			{
				count++;
			}
		}
	}
	printf("%d", count);
	return 0;
}

7. 蛇形方阵

题目描述

给出一个不大于 9 的正整数 n,输出 n×n
的蛇形方阵。

从左上角填上 1 开始顺时针方向依次填入数字,如同样例所示。注意每个数字都会占用 3 个字符,前面使用空格补齐。

输入格式

输入一个正整数 n(1≤n≤9),含义如题所述。

输出格式

输出符合题目要求的蛇形矩阵。

样例输入

4

样例输出

  1  2  3  4
 12 13 14  5
 11 16 15  6
 10  9  8  7
#include
int main()
{
	int i, j, n, m, num[10][10];
	scanf("%d",&n); 
	i=1;
	m=1;
	if(i==1) num[1][i]=1;
	while(i < n+1-i)		 
	{
		for(j = i; j <= n+1-i; j++) 
			num[i][j] = m++;
		for(j = i+1; j <= n+1-i; j++) 
			num[j][n+1-i] = m++;
		for(j = n-i; j >= i; j--) 
			num[n+1-i][j] = m++;
		for(j = n-i; j >= i+1; j--) 
			num[j][i] = m++;
		i++;
		if(i == n+1-i) 
		{
			num[i][i] = n*n;
			break;
		}
	}
	for(i=1; i<=n; i++)
	{
		for(j=1; j<=n; j++)
		{
			printf("%3d",num[i][j]);
		}
		if (i != n)
			printf("\n");
	}
	return 0;
}

8. STROJOPIS(统计手指按键次数)

题目描述

正确的打字正成为文化的重要组成部分。如果你仍然没有使用所有的十根手指来打字,你必须重新学习打字——然后你会打字更快,感觉更舒适和愉快。

有很多网站教你正确打字。下图描述了基本原理:用同一个指针按所需的键是同一颜色的。黄色键需要用小指按下,蓝色键需要用无名指,绿色键需要用中指,红色键需要用食指。自然,左手按键盘的左侧(从 5TGB 开始向左的键),右手按右侧(从 6YHN 开始向右的键),拇指负责空格。

洛谷基础题练习14_第1张图片

您的任务是输出每根手指(拇指除外)正确输入给定字符串的分别按下的次数。

输入格式

仅一行一个字符串 s(不超过50个字符)。字符串不包含空格,只包含上面图像中包含的字符。

输出格式

输出必须由八行组成,每行一个整数,表示从左到右观察到的每个手指的按键次数(拇指除外)。

样例输入 #1

AON=BOO;

样例输出 #1

1
0
0
1
1
0
3
2

样例输入 #2

PRINT'NY'[NASLA]

样例输出 #2

2
1
0
2
4
1
1
5

样例输入 #3

VIDI,KO,JE,DOSA

样例输出 #3

1
1
3
1
1
6
2 
0

提示

令 |s| 表示输入字符串的长度,则对于 100% 的数据,有1≤∣s∣≤50。

# a~b表示左手,小指~食指 keys:可按键的范围 times:该指按键次数
a = {'keys': ['1', 'Q', 'A', 'Z'], 'times': 0}
b = {'keys': ['2', 'W', 'S', 'X'], 'times': 0}
c = {'keys': ['3', 'E', 'D', 'C'], 'times': 0}
d = {'keys': ['4', 'R', 'F', 'V', '5', 'T', 'G', 'B'], 'times': 0}
# e~h表示右手,食指~小指
e = {'keys': ['6', '7', 'Y', 'U', 'H', 'J', 'N', 'M'], 'times': 0}
f = {'keys': ['8', 'I', 'K', ','], 'times': 0}
g = {'keys': ['9', 'O', 'L', '.'], 'times': 0}
h = {'keys': ['0', '-', '=', 'P', '[', ']', ';', "'", "/"], 'times': 0}


s = input().strip()
for i in s:
    if i in a['keys']:
        a['times'] += 1
    if i in b['keys']:
        b['times'] += 1
    if i in c['keys']:
        c['times'] += 1
    if i in d['keys']:
        d['times'] += 1
    if i in e['keys']:
        e['times'] += 1
    if i in f['keys']:
        f['times'] += 1
    if i in g['keys']:
        g['times'] += 1
    if i in h['keys']:
        h['times'] += 1
print(a['times'])
print(b['times'])
print(c['times'])
print(d['times'])
print(e['times'])
print(f['times'])
print(g['times'])
print(h['times'])

你可能感兴趣的:(学习笔记,数据结构,洛谷,编程基础,python)