团队第二届比赛队长题解
2026-08-30 20:51:33
发布于:浙江
哎,太晚了,希望大家没有不开心。以下是题解。
1.
浮点数输出
时间限制:1000ms
内存限制:128MB
输入一个浮点数,保留 位小数输出。
输入格式
输入一个浮点数。
输出格式
保留 位小数输出这个浮点数。
样例组
输入#1 复制
12.3432123457
输出#1 复制
12.34321
这道题是经典的格式化输入输出题目,主要考察printf小数输出的掌握。
简单的不得了,代码框架如下
框架——>定义double类型变量——>输入——>格式化输出
代码参考
#include <bits/stdc++.h>
using namespace std;
int main(){
double a;
cin >> a;
printf("%.5lf",a);
return 0;
}
字母统计
时间限制:1000ms
内存限制:128MB
给出一个仅包含小写字母的字符串,长度<=100。请统计其中出现次数最多的字母。
输入格式
输入一行只包含小写字母的字符串
(strlen<=100)
输出格式
按要求输出出现次数最多的字母,若存在答案次数出现相同的字母,输出ASCII值最小的字母
样例组
输入#1复制
helloworld
输出#1复制
l
提示说明
无
这是一个经典的字符频率统计问题。我们需要统计字符串中每个小写字母出现的次数,找出出现次数最多的那个。如果多个字母出现次数相同且均为最大值,则选择 ASCII 码值最小(即字典序最小)的字母。
解题思路
数据存储:由于输入仅包含小写字母('a'-'z'),我们可以使用一个长度为 26 的整数数组 count 来存储每个字母的出现次数。count 对应 'a',count 对应 'b',以此类推。
统计频次:遍历输入字符串中的每一个字符 c,通过 c - 'a' 计算出该字符在数组中的索引,并将对应位置的计数加 1。
寻找最大值:遍历 count 数组(从索引 0 到 25,即从 'a' 到 'z')。
维护一个变量 max_count 记录当前遇到的最大出现次数。
维护一个变量 result_char 记录对应的字母。
关键点:因为我们要找 ASCII 值最小的字母,所以我们从 'a' (索引0) 开始遍历到 'z' (索引25)。当发现当前字母的次数 严格大于 max_count 时,才更新 max_count 和 result_char。这样,如果后面遇到次数相同的字母,由于条件不满足(不是严格大于),不会更新结果,从而保留了前面遇到的(ASCII 值更小的)字母。
代码实现
#include <iostream>
#include <string>
using namespace std;
int main() {
string s;
cin >> s;
int count[27] = {0};
for (char c : s) {
count[c - 'a']++;
}
int max_count = -1;
char result_char = 'a';
计算邮资
时间限制:1000ms
内存限制:128MB
请根据邮件的重量和用户选择是否加急计算邮费。计算规则:
• 重量在 1000以内(包括),基本费 8 元;
• 超过 1000克的部分,每 500 克加收超重费 4元,不足 500 克部分按 500 克计算;
• 如果用户选择加急,多收 5 元。
输入格式
一行,包含一个正整数 和一个字符 c(y 或 n),之间用一个空格隔开,分别表示重量和是否加急。
如果字符是 y,说明选择加急;如果字符是 n,说明不加急。
输出格式
输出一行一个正整数,表示邮费。
样例组
输入#1 复制
1200 y
输出#1 复制
17
提示说明
对于100%数据 1 <= x <= 10^6
1.输入解析:读取邮件重量 a 和加急标识 c。
2.分支处理:根据是否加急(c 为 'y' 或 'n')将逻辑分为两大块。
3.超重计算核心:
*在两个分支中,都首先判断重量是否超过 1000 克。
*若超重,计算超出部分 b = a - 1000。
通过取模运算 b % 500 判断是否需要进位:
4若能整除,计费单位 d = b / 500;
*若不能整除,计费单位 d = b / 500 + 1(实现“不足 500 克按 500 克算”的向上取整逻辑)。
*最后根据公式 8 + 4 * d 计算基础邮资。
4.加急附加:
*如果是加急('y'),在基础邮资上额外 +5 并输出。
*如果不加急('n'),直接输出基础邮资。
*注意:在不加急分支中,还单独处理了未超重(a <= 1000)的情况,直接输出 8 元。
代码实现
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a,b,d;
char c;
cin>>a>>c;
if(c=='y'){
if(a>1000){
b=a-1000;
if(b%500==0){
d=b/500;
}
else{
d=b/500+1;
}
cout<<8+4*d+5;
}
}
else if(c=='n'){
if(a>1000){
b=a-1000;
if(b%500==0){
d=b/500;
}
else{
d=b/500+1;
}
cout<<8+4*d;
}
else if(a<=1000){
cout<<8;
}
}
return 0;
}
循环[典型10]支撑数
时间限制:1000ms
内存限制:128MB
在已知一组整数中,有这样一种数非常怪,它们不在第一个,也不在最后一个,而且刚好都比左边和右边相邻的数大,你能找到它们吗?
输入格式
第一行为整数 m,表示输入的整数个数。( 3≤m≤100 ) 第二行为 m 个整数。
输出格式
输出若干行,每行一个支撑数。
样例组
输入#1复制
6
1 3 2 4 1 5
输出#1复制
3
4
提示说明
无
这题考查数组运用,我们一步一步来。
这个数比香菱两个数都大,还不是第一个或者最后一个,那么输入就要用新格式:
int a[110],n;
cin >> n;
cin >> a[0];
for(int i = 1;i < n - 1;i ++){
cin >> a[i];
}
cin >> a[n - 1];
接着输出也是从 1(下标)~ n – 1(下标)中挑选。
而判断内容则是 a[i] > a[i - 1] && a[i] > a[i+1]
那么是:
for(int i = 1;i < n - 1;i ++){
if(a[i] > a[i - 1] && a[i] > a[i+1])
cout << a[i] << endl;
}
}
合并起来即可。
最后一题
根据题目描述,逻辑判断如下:
- 如果输入的名字是 min,输出 hi.
- 如果输入的名字不是 min,输出 Hello,Hello.
注意标点符号和大小写需严格匹配样例。
特别的简单
代码
#include <iostream>
#include <string>
using namespace std;
int main() {
string name;
cin >> name;
if (name == "min") {
cout << "hi." << endl;
} else {
cout << "Hello,Hello." << endl;
}
return 0;
}
这里空空如也











有帮助,赞一个