NENU 模拟练习题(问题A~问题G)

问题 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个整数ABC,请判断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;
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里是50种不同国家的语言表达“我爱你”: 1. English - I love you 2. Spanish - Te quiero 3. French - Je t'aime 4. German - Ich liebe Dich 5. Italian - Ti amo 6. Portuguese - Eu te amo 7. Russian - Ya lyublyu tebya 8. Chinese (Mandarin) - Wo ai ni 9. Japanese - Aishiteru 10. Korean - Sarang hae 11. Arabic - Ana behibak (to a male) / Ana behibek (to a female) 12. Dutch - Ik hou van je 13. Danish - Jeg elsker dig 14. Swedish - Jag älskar dig 15. Norwegian - Jeg elsker deg 16. Finnish - Minä rakastan sinua 17. Polish - Kocham Cię 18. Czech - Miluji Tě 19. Hungarian - Szeretlek 20. Bulgarian - Obicham te 21. Greek - S'ayapo 22. Turkish - Seni seviyorum 23. Romanian - Te iubesc 24. Croatian - Volim te 25. Serbian - Volim te 26. Slovenian - Ljubim te 27. Slovak - Milujem Ťa 28. Estonian - Ma armastan sind 29. Latvian - Es tevi mīlu 30. Lithuanian - Aš tave myliu 31. Icelandic - Ég elska þig 32. Albanian - Te dua 33. Thai - Phom rak khun (to a male) / Chan rak khun (to a female) 34. Vietnamese - Anh ye^u em (to a female) / Em ye^u anh (to a male) 35. Indonesian - Saya cinta padamu 36. Filipino - Mahal kita 37. Hindi - Main tumse pyar karta hoon 38. Bengali - Ami tomake bhalobashi 39. Urdu - Main tumse muhabbat karta hoon 40. Marathi - Me tujhe pyaar kartaa hoo 41. Punjabi - Main tere pyar da haan 42. Telugu - Nenu ninnu premisthunnanu 43. Tamil - Naan unnai kaadhalikken 44. Malayalam - Njan ninnodenikkoo 45. Kannada - Naanu ninna preetisuttene 46. Gujrati - Hu tane pyar karoo chu 47. Nepali - Ma timilai maya garchu 48. Sinhala - Mama oyata arderyi 49. Burmese - Chit pa de 50. Mongolian - Bi chamd hairtai
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值