文章目录
问题 A: 2011 模拟测试1(成绩排名)
题目描述
又到一年一度的期末考试了,老师最头痛的问题就是从一堆学生中找最高分和最低分,你快来帮忙吧。
输入
测试数据有多组,每组首先是一个正整数n(0 < n < 31),接下来是n行数据,每行数据代表一个学生的成绩,分部为学生的姓名、学号、成绩。其中姓名和学号均为不超过10个字符的字符串,成绩为0到100之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。
输出
每组分两行输出成绩最高和成绩最低学生的姓名、学号和成绩,字符串间有1空格,两组之间用空行隔开。
样例输入
3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95
2
Zhangsan SW9801 70
Lisi EN9801 59
样例输出
Mike CS991301 100
Joe Math990112 89
Zhangsan SW9801 70
Lisi EN9801 59
解析
sort()函数
sort()函数可以对给定区间所有元素进行排序。它有三个参数sort(begin, end, cmp)
,其中begin为指向待sort()的数组的第一个元素的指针,end为指向待sort()的数组的最后一个元素的下一个位置的指针,cmp参数为排序准则,cmp参数可以不写,如果不写的话,默认从小到大进行排序。
例如对数组a排序时,可以写成sort(a,a+n)
。n是数组大小。
排序准则cmp的写法
如此题,我们把stud数组按照score从大到小排序,就能像这样书写排序准则:
bool cmp(const stud x,const stud y){
return x.score > y.score;
}
再结合sort(s, s + i, cmp);
就能将学生信息按照成绩从大到小排序。
参考代码
#include<bits/stdc++.h>
using namespace std;
struct stud{
string name, num;
int score;
};
bool cmp(const stud x,const stud y){
return x.score > y.score;
}
int main(){
int t;
while(cin>>t){
stud s[t];
int i = 0;
while(t--){
cin >> s[i++].name >> s[i-1].num >> s[i-1].score;
}
sort(s, s + i, cmp);
cout << s[0].name << " " << s[0].num << " " << s[0].score << endl
<< s[i - 1].name << " " << s[i - 1].num << " " << s[i - 1].score << endl
<< endl;
}
return 0;
}
问题 B: 2012 模拟测试1( A+B和C)
题目描述
给定区间 [ − 2 31 , 2 31 ] 内的 3 个整数 A 、 B 和 C ,请判断 A + B 是否大于 C 。 给定区间[-2^{31}, 2^{31}]内的3个整数A、B和C,请判断A+B是否大于C。 给定区间[−231,231]内的3个整数A、B和C,请判断A+B是否大于C。
输入
输入第1行给出正整数T( T <= 10),是测试用例的个数。随后给出T组测试用例,每组占一行,顺序给出A、B和C。整数间以空格分隔。
输出
对每组测试用例,如果A+B>C,在一行中输出“Case #X: true”。否则输出“Case #X: false”,其中X是测试用例的编号(从1开始)。
样例输入
4
1 2 3
2 3 4
2147483647 0 2147483646
0 -2147483648 -2147483647
样例输出
Case #1: false
Case #2: true
Case #3: true
Case #4: false
解析
见代码。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin >> t;
int ind = 1;
while(t--){
long long a, b, c;
cin >> a >> b >> c;
if(a+b>c){
cout << "Case #" << ind << ": true" << endl;
}
else{
cout << "Case #" << ind << ": false" << endl;
}
ind++;
}
return 0;
}
问题 C: 2013 模拟测试1(个位数统计)
题目描述
给定一个k位整数N,请编写程序统计每种不同的个位数字出现的次数。例如:给定N = 100311,则有2个0,3个1和1个3。
输入
输入有多个,每行包含1个测试用例,即一个不超过1000位的正整数N。
输出
对N中每一种不同的个位数字,以D:M的格式在一行中输出该位数字D及其在N中出现的次数M。要求按D的升序输出。
样例输入
100311
1
样例输出
0:2
1:3
3:1
1:1
解析
见代码。
参考代码
#include<bits/stdc++.h>
using namespace std;
const int N = 10;
int nx[N];
int main(){
string num;
while(cin>>num){
for (int i = 0; i < num.length();i++)
nx[num[i] - '0']++;
for (int i = 0; i < 10;i++){
if(nx[i]>0){
cout << i << ":" << nx[i] << endl;
nx[i] = 0;
}
}
}
return 0;
}
问题 D: 2014 模拟测试1(A+B)
题目描述
求A+B的和。
输入
有多组数据,每组两行,每行是一个不超过200位的非负整数,没有多余的前导0。
输出
每组输出一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。
样例输入
1
2
1
9
样例输出
3
10
解析
这题的数据范围很大,甚至超过long long型,所以只是单纯的相加得到答案是不通过的qwq,我们要把加法器的原理复刻出来。
注意:0+0要另外判断,不然容易被当做前导0删掉。
参考代码
#include<bits/stdc++.h>
using namespace std;
const int N = 300;
int na[N], nb[N];
int main(){
string a, b;
while(cin>>a>>b){
vector<int> c;
int lena = a.length(), lenb = b.length();
if(a[0]=='0'&&b[0]=='0'&&lena==1&&lenb==1){
cout << "0" << endl;
continue;
}
int len = lena;
if(len<lenb)
len = lenb;
len += 1;
int flag = 0, flagx = 0;
for (int i=0;i<len;i++){
if(lena-i-1>=0)
na[len - i] = a[lena - i - 1] - '0';
else
na[len-i] = 0;
if(lenb-i-1>=0)
nb[len - i] = b[lenb - i - 1] - '0';
else
nb[len-i] = 0;
c.push_back((na[len - i] + nb[len - i] + flagx) % 10);
if(na[len-i]+nb[len-i]+flagx>=10)
flagx = 1;
else
flagx = 0;
}
reverse(c.begin(), c.end());
int ind = 1;
for (int i = 0; i < c.size();i++){
if(ind&&c[i]==0)
continue;
else{
cout << c[i];
ind = 0;
}
}
cout << endl;
}
return 0;
}
问题 E: 2015 模拟测试1(区间求和)
题目描述
给定一个正整数a和b,求其区间(包括a和b)内所有被3或5整除的数之和。
输入
输入第1行给出正整数N,是测试用例的个数。随后给出N组测试用例,每组占一行,顺序给出正整数a和b。整数间以空格分隔。a不大于b,其和也不会超过整数范围。
输出
对于每组测试用例,输出a和b之间能被3整除或能被5整除的所有数之和。
样例输入
3
1 10
1 11
1 3
样例输出
33
33
3
解析
见代码。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
cin >> t;
while(t--){
int a, b, sum = 0;
cin >> a >> b;
for (int i = a; i <= b;i++)
if(i%3==0||i%5==0)
sum += i;
cout << sum << endl;
}
return 0;
}
问题 F: 2016 模拟测试1(非法日期)
题目描述
在填写各种日期时,用户经常会填错日期,要求你编程实现对日期有效性进行判断。
输入
输入有多组数据,每组一行,表示一个日期,格式为“2016.5.24”。
输出
每组输入给出判断,如果日期有效,则先输出该日期,然后输出true,无效则输出false,中间一个空格隔开。
样例输入
2016.5.24
2016.2.30
2016.6.31
样例输出
2016.5.24 true
2016.2.30 false
2016.6.31 false
解析
见代码。
参考代码
#include <bits/stdc++.h>
using namespace std;
int mon[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int main()
{
int yy, mm, dd;
while(scanf("%d.%d.%d", &yy, &mm, &dd)!=EOF){
if ((yy % 400 != 0 && yy % 100 == 0) || yy % 4 != 0)
mon[2] = 28;
else
mon[2] = 29;
if (mm>=1&&mm<=12&&mon[mm] >= dd)
cout << yy << "." << mm << "." << dd << " true" << endl;
else
cout << yy << "." << mm<< "." << dd << " false" << endl;
}
return 0;
}
问题 G: 2017 模拟测试1(统计不及格人数)
题目描述
又到一年一度的期末考试了,老师最头痛的问题就是从一堆学生中统计不及格的人数,你快来帮忙吧。
输入
有多组测试用例,每组第一行是正整数N(0 < N < 201),然后是N行数据,每行表示一个学生的学号和成绩,中间空格隔开。
输出
每组测试用例输出不及格(成绩<60)人数。
样例输入
2
CS2015001 88
SW2013002 76
3
EN2014001 59
MA2015002 95
PH2013007 77
样例输出
0
1
解析
见代码。
参考代码
#include<bits/stdc++.h>
using namespace std;
int main(){
int t;
while(cin>>t){
int renshu = 0;
while(t--){
string xuehao;
int score;
cin >> xuehao >> score;
if(score<60)
renshu++;
}
cout << renshu << endl;
}
return 0;
}