蓝桥杯备赛|成绩统计|排列字母|纸张尺寸

Posted alwaysuzybaiyy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了蓝桥杯备赛|成绩统计|排列字母|纸张尺寸相关的知识,希望对你有一定的参考价值。

目录

 

1 成绩统计

题目描述

输入描述

输出描述

输入输出样例

示例

1.1 解题思路

1.2 AC_Code

Python 标程

2 排列字母

问题描述

2.1 解题思路

2.2 AC_Code

Python 标程

3 纸张尺寸

问题描述

输入格式

输出格式

样例输入1

样例输出1

样例输入 2

样例输出 2

运行限制

3.1 解题思路

3.2 AC_Code

Python 标程


1 成绩统计

蓝桥杯题库502

题目描述

小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。

如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。

请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整 数。

输入描述

输入的第一行包含一个整数 n (1≤n≤10^4),表示考试人数。

接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。

输出描述

输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分 四舍五入保留整数。

输入输出样例

示例

#输入
7
80
92
56
74
88
100
0

#输出
71%
43%

1.1 解题思路

简单模拟题。

用 cnt1 表示及格的人数,cnt2 表示优秀的人数,那么答案即为 cnt1/n ​、cnt2/n​ 四舍五入后 ×100。百分号别忘记输出!

1.2 AC_Code

C++ 标程

Java 标程

Python 标程

import os
import sys

# 请在此输入您的代码
n = int(input())
cnt1 = 0
cnt2 = 0
for i in range(1,n+1):
  x = int(input())
  if x>= 60:
    cnt1 += 1
  if x>= 85:
    cnt2 += 1

print(":.0f%".format(round(100.0 * cnt1 / n , 2)))
print(":.0f%".format(round(100.0 * cnt2 / n , 2)))

2 排列字母

蓝桥杯题库2118

问题描述

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

小蓝要把一个字符串中的字母按其在字母表中的顺序排列。

例如,LANQIAO 排列后为 AAILNOQ。

又如,GOODGOODSTUDYDAYDAYUP 排列后为 AADDDDDGGOOOOPSTUUYYY。

请问对于以下字符串,排列之后字符串是什么?

WHERETHEREISAWILLTHEREISAWAY

AAAEEEEEEHHHIIILLRRRSSTTWWWY

2.1 解题思路

直接对字符串进行排序即可,可以使用各类语言的标准排序函数,例如C++中使用sort标准库函数;Java中转换成数组使用Arrays.sort排序;Python中先转换成list再进行排序,最后拼接成字符串(因为Python中无法修改字符串元素)。

也可以手动对字符串进行排序,直接输出结果。

a = 'AAAEEEEEEHHHIIILLRRRSSTTWWWY'
print(a)

2.2 AC_Code

C++ 标程

Java 标程

Python 标程

s = "WHERETHEREISAWILLTHEREISAWAY"
s = list(s)
s.sort()
print("".join(s))

3 纸张尺寸

蓝桥杯题库2120

问题描述

在 ISO 国际标准中定义了 A0 纸张的大小为 1189mm ×× 841mm, 将 A0 纸 沿长边对折后为 A1 纸, 大小为 841mm ×× 594mm, 在对折的过程中长度直接取 下整 (实际裁剪时可能有损耗)。将 A1 纸沿长边对折后为 A2 纸, 依此类推。

输入纸张的名称, 请输出纸张的大小。

输入格式

输入一行包含一个字符串表示纸张的名称, 该名称一定是 A0、A1、A2、 A3、A4、A5、A6、A7、A8、A9 之一。

输出格式

输出两行,每行包含一个整数,依次表示长边和短边的长度。

样例输入1

A0

样例输出1

1189
841

样例输入 2

A1

样例输出 2

841
594

运行限制

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

3.1 解题思路

根据题意维护长边长度 a 和短边长度 b 即可。对于输入 A0 而言,a=1189,b=841。

根据输入的 A 后面的数字 x ,循环 x 次:

—— 每次让长边 a 除以 2(向下取整),短边 b 不变。

—— 然后再根据a ,b 的大小关系进行调整,如果 a<b 则交换 a,b。

3.2 AC_Code

C++ 标程

Java 标程

Python 标程

import os
import sys

# 请在此输入您的代码
x = int(input()[1])
a,b = 1189, 841 # 维护长边长度a和短边长度b
# 输入A0,a=1189,b=841
# 输入Ax,根据x循环x次(对折x次)
for i in range(x):
  # 也可以直接a,b=b,a//2    
  a //= 2   # 每次让长边a除以2(向下取整),短边b不变
  if a < b:  # 再根据a,b的大小关系进行调整
    a, b = b, a  # 永远让a表示长边,永远让b表示短边
print(a)
print(b)

蓝桥杯备赛(第十届(1) )

在这里插入图片描述
思路一:(一重循环)
2019 < x < y
x至少从2020开始,然后利用等差数列的性质,及
x2 - 2019 * 2019 = y2 - x2 推算出y2 = 2 * x2 - 2019 * 2019
然后判断y2开根号再 平方是否与y2相等,若相等,则输出。

#include<cstdio>
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
	int t=2019*2019;
	for(int x=2020;;x++)
	{
		int x2=x*x;
		int y2=2*x2-t;
		int y=sqrt(y2);
		if(y*y==y2)
		{
			cout<<x+y<<endl;
		break;
		}
	}
	return 0;
}

思路二:(二重循环)

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e4+10;
int main() {
	LL t = 2019*2019, x, y;
	LL rx = N, ry = N;
	for(int i = 2020; i < N; ++i) {
		for(int j = i+1; j < N; ++j) {
			x = i*i; y = j*j;
			if(y-x == x-t && i+j < rx+ry) rx = i, ry = j;
		}
	}
	cout << rx << " " << ry << " " << rx + ry << endl;
	return 0;
}

答案: 7020
在这里插入图片描述
step1 先找出2019以内的素数;
step2 用记忆化搜索求方案数。

dp[pos][sum]表示素数数组中的位置pos,目前总和为sum的方案数;
dfs(int pos, int sum)求在位置为pos,总和为sum时对应的方案数。

dp[pos][sum] =
dfs(pos+1, sum)+dfs(pos+1, sum+p[pos])
dfs(pos+1, sum)不要pos这个位置上的素数;
dfs(pos+1, sum+p[pos])要pos这个位置上的素数

变量类型用long long

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 3000;
int p[N], v[N], res, tot;
LL dp[400][N];
LL dfs(int pos, int sum) {
	if(pos == tot + 2 || sum > 2019) return 0;
	if(dp[pos][sum] != -1) return dp[pos][sum];//记忆性递归
	if(sum == 2019) return 1;
	
	LL mid = 0;
	mid += dfs(pos+1, sum);//不取
	mid += dfs(pos+1, sum+p[pos]);//取
	return dp[pos][sum] = mid;
}
int main() {
//埃氏筛法素数打表
	for(int i = 2; i <= 2019; ++i) {
		if(v[i]) continue; 
		p[++tot] = i; 
		for(int j = i+i; j <= 2019; j += i) 
        v[j] = 1;
	}
	memset(dp, -1, sizeof dp);
	cout << dfs(1, 0);
	return 0;
}

答案: 55965365465060

以上思路和代码参考学校蓝桥杯老师辅导(讲的太好了)!

以上是关于蓝桥杯备赛|成绩统计|排列字母|纸张尺寸的主要内容,如果未能解决你的问题,请参考以下文章

Java在算法竞赛中的技巧(蓝桥杯备赛总结)

蓝桥杯备赛刷题

蓝桥杯备赛刷题

蓝桥杯备赛--二分查找

蓝桥杯备赛--二分查找

蓝桥杯备赛--教你用矩阵优化递推