目录
成绩统计
题目描述
小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。
如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。
请计算及格率和优秀率,用百分数表示,百分号前的部分四舍五入保留整 数。
输入描述
输入的第一行包含一个整数 n (1 ≤ n ≤ 104),表示考试人数。
接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。
输出描述
输出两行,每行一个百分数,分别表示及格率和优秀率。百分号前的部分 四舍五入保留整数。
输入输出样例
示例
输入
7
80
92
56
74
88
100
0
输出
71%
43%
运行限制
- 最大运行时间:1s
- 最大运行内存: 256M
解题思路
本题没有什么难点,唯一的地方是要注意最后的 四舍五入 ,用 +0.5 来实现四舍五入,如果是负数,就 -0.5 。
先循环,每一次循环输入一个数,紧接着判断数是否满足优秀或者几个的条件,由于要计算优秀率和及格率,我们需要在判断语句里面 有cnt++(用来记录一下及格和优秀的人数)。
AC_Code
使用 +- 0.5实现算法题里面的四舍五入
Setprecision()
setprecision() | 管理浮点操作的精度 |
参数
n | - | 精度的新值 |
返回值
返回未指定类型的对象,使得若 str
是 std::basic_ostream<CharT, Traits> 类型的输出流名称或 std::basic_istream<CharT, Traits> 类型的输入流名称,则表达式 str << setprecision(n) 或 str >> setprecision(n) 表现为如同执行下列代码:
str.precision(n);
示例
#include <iostream> #include <iomanip> #include <cmath> #include <limits> int main() { const long double pi = std::acos(-1.L); std::cout << "default precision (6): " << pi << '\n' << "std::setprecision(10): " << std::setprecision(10) << pi << '\n' << "max precision: " << std::setprecision(std::numeric_limits<long double>::digits10 + 1) << pi << '\n'; }
输出:
default precision (6): 3.14159 std::setprecision(10): 3.141592654 max precision: 3.141592653589793239
使用 setprecision() 函数
成绩统计不需要加0.5了,只需要把后四句改为
cout << setprection(0) << fixed << (1.0 * cnt1 / n * 100) << "%\n" << (1.0 * cnt2 / n * 100) << "%\n";
这里使用 fixed 使保留几位小数变成了从小数点后面开始,如果不配合fixed使用的话,单单的
setprecision(),就是从第一个数字开始。
蓝桥杯2020年第十一届省赛真题-成绩分析
题目描述
小蓝给学生们组织了一场考试,卷面总分为100 分,每个学生的得分都是一个0 到100 的整数。请计算这次考试的最高分、最低分和平均分。
输入格式
输入的第一行包含一个整数n,表示考试人数。
接下来n 行,每行包含一个0 至100 的整数,表示一个学生的得分。
输出格式
输出三行。
第一行包含一个整数,表示最高分。
第二行包含一个整数,表示最低分。
第三行包含一个实数,四舍五入保留正好两位小数,表示平均分。
样例输入
7 80 92 56 74 88 99 10
样例输出
99 10 71.29
提示
对于50% 的评测用例, 1 ≤ n ≤ 100。
对于所有评测用例,1 ≤ n ≤10000。
解题思路
和上面的成绩统计一样,就是四舍五入使用的是round函数
AC_Code
#include<bits/stdc++.h>
using namespace std;
const int N = 10000;
int main()
{
int n, a[N], sum, max, min;
double avg;
sum = 0;
max = 0;
min = 100;
cin >> n;
for(int i = 1;i <= n; i ++){
cin >> a[i];
sum += a[i];
if(a[i] > max) max = a[i];
if(a[i] < min) min = a[i];
}
avg = 1.0 * sum / n;
avg = round(avg * 100) / 100;
cout << max << endl;
cout << min << endl;
printf("%.2f",avg);
return 0;
}
九进制转十进制
九进制正整数 (2022)9(2022)9 转换成十进制等于多少?
运行限制
- 最大运行时间:1s
- 最大运行内存: 512M
解题思路
AC_Code
#include <iostream>
using namespace std;
int main()
{
string s = "2022";
int ans = 0;
for(int i = 0; i < s.size();i ++)
ans = ans * 9 + s[i] - '0';
cout << ans << endl;
return 0;
}
跑步锻炼
题目大意
小蓝每天都锻炼身体。
正常情况下,小蓝每天跑 11 千米。如果某天是周一或者月初(11 日),为了激励自己,小蓝要跑 22 千米。如果同时是周一或月初,小蓝也是跑 22 千米。
小蓝跑步已经坚持了很长时间,从 20002000 年 11 月 11 日周六(含)到 20202020 年 1010 月 11 日周四(含)。请问这段时间小蓝总共跑步多少千米?
解题思路
简单模拟题。
主要需要解决两个问题:
- 是否是月初
- 是否是周一
我们可以枚举从 2000 年 1 月 1日到 2020 年 10 月 1 日的所有日期:用 y、m、d 分表表示当前枚举的年、月、日,那么当 d=1 为月初,否则不为月初。问题一解决。
同时我们可以定义 week 表示当前日期所对应的星期,这样下一个日期所对应的星期就为 (week+1)。那么当 week=1 时为周一,否则不为周一。问题二解决。
最后模拟一下即可(注意判断闰年),答案为 8879
。
AC_Code
#include<bits/stdc++.h>
using namespace std;
int D[13];
bool check(int y){
if(y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) return true;
return false;
}
signed main()
{
D[1] = 31 , D[2] = 28 , D[3] = 31 , D[4] = 30 , D[5] = 31 , D[6] = 30;
D[7] = 31 , D[8] = 31 , D[9] = 30 , D[10] = 31 , D[11] = 30 , D[12] = 31;
int ans = 0 , week = 6;
for(int y = 2000 ; y <= 2020 ; y ++){
if(check(y)) D[2] = 29;
else D[2] = 28;
for(int m = 1 ; m <= (y == 2020 ? 10 : 12) ; m ++){
if(y == 2020 && m == 10) D[m] = 1;
for(int d = 1 ; d <= D[m] ; d ++){
if(week == 1 || d == 1) ans += 2;
else ans += 1;
week = (week + 1) % 7;
}
}
}
cout << ans << '\n';
return 0;
}
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int days[] = {
0, 31, 28, 31, 30, 31, 30,
31, 31, 30, 31, 30, 31
};
bool is_leap(int y){
return y % 100 != 0 && y % 4 == 0 || y % 400 == 0;
}
int daysOfMonth(int y, int m){
if (m == 2)
return 28 + is_leap(y);
return days[m];
}
int main()
{
int y = 2000, m = 1, d = 1, w = 6;
int res = 0;
while (y != 2020 || m != 10 || d != 2){
if (d == 1 || w == 1)
res += 2;
else
res ++;
w ++;
if (w == 8)
w = 1;
d ++;
if (d > daysOfMonth(y, m)){
m ++, d = 1;
if (m == 13)
m = 1, y ++;
}
}
cout << res << endl;
return 0;
}
刷题统计
题目大意
小明决定从下周一开始努力刷题准备蓝桥杯竞赛。他计划周一至周五每天 做 a 道题目, 周六和周日每天做 b 道题目。请你帮小明计算, 按照计划他将在 第几天实现做题数大于等于 n 题?
输入格式
输入一行包含三个整数 a,b 和 n.
输出格式
输出一个整数代表天数。
样例输入
10 20 99
样例输出
8
评测用例规模与约定
解题思路
一周的做题量为5a+2b,这是一个固定的值。需要实现大于等于 n 题,可以先计算至少需要多少周。
直接用n除以5a+2b得到需要花费的周数,剩下的题数为n,直接暴力计算需要几天可以完成.
AC_Code
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll a, b, n;
cin >> a >> b >> n;
//一周可完成num道题目
ll num = 5 * a + 2 * b;
ll ans = n / num * 7;
n = n % num;
//模拟最后一周的周一到周五
for(int i = 1; i <= 5; i++)
{
if(n <= 0)break;
ans++;
n -= a;
}
//模拟最后一周的周六到周日
for(int i = 1; i <= 2; i++)
{
if(n <= 0)break;
ans++;
n -= b;
}
cout<<ans<<endl;
return 0;
}