【2022天梯赛暑期集训】第一次试题(简单模拟、查找元素、日期处理、图形输出)

酶和ATP 2022年07月11日 784次浏览

题目集链接,非本校同学可能打不开 https://pintia.cn/problem-sets/1546142650662113280/submissions

7-1 写出这个数

分数 10

作者 xxxtentx

单位 江西财经大学

读入一个正整数 n,计算其各位数字之和,用汉语拼音写出和的每一位数字。

输入格式:

每个测试输入包含 1 个测试用例,即给出自然数 n 的值。这里保证 n 小于 10100

输出格式:

在一行内输出 n 的各位数字之和的每一位,拼音数字间有 1 空格,但一行中最后一个拼音数字后没有空格。

输入样例:

在这里给出一组输入。例如:

1234567890987654321123456789

输出样例:

在这里给出相应的输出。例如:

yi san wu

没什么难度

#include <algorithm>
#include <cstring>
#include <iostream>
#include <stack>
using namespace std;

int main() {
    string n;
    getline(cin, n);
    int cnt = 0;
    for (int i = 0; i < n.size(); i++) cnt += (n[i] - '0');
    stack<string> st;
    while (cnt) {
        switch (cnt % 10) {
            case 0:
                st.push("ling");
                break;
            case 1:
                st.push("yi");
                break;
            case 2:
                st.push("er");
                break;
            case 3:
                st.push("san");
                break;
            case 4:
                st.push("si");
                break;
            case 5:
                st.push("wu");
                break;
            case 6:
                st.push("liu");
                break;
            case 7:
                st.push("qi");
                break;
            case 8:
                st.push("ba");
                break;
            case 9:
                st.push("jiu");
                break;
        }
        cnt /= 10;
    }
    cout << st.top();
    st.pop();
    while (!st.empty()) {
        cout << " " << st.top();
        st.pop();
    }
    return 0;
}

7-2 成绩排名

分数 25

作者 江太白

单位 江西财经大学

读入 n(>0)名学生的姓名、学号、成绩,分别输出成绩最高和成绩最低学生的姓名和学号。

输入格式:

每个测试输入包含 1 个测试用例,格式为

第 1 行:正整数 n

第 2 行:第 1 个学生的姓名 学号 成绩

第 3 行:第 2 个学生的姓名 学号 成绩

... ... ...

第 n+1 行:第 n 个学生的姓名 学号 成绩

其中姓名和学号均为不超过 10 个字符的字符串,成绩为 0 到 100 之间的一个整数,这里保证在一组测试用例中没有两个学生的成绩是相同的。

输出格式:

对每个测试用例输出 2 行,第 1 行是成绩最高学生的姓名和学号,第 2 行是成绩最低学生的姓名和学号,字符串间有 1 空格。

输入样例:

3
Joe Math990112 89
Mike CS991301 100
Mary EE990830 95

输出样例:

Mike CS991301
Joe Math990112

复习一下结构体存储数据和sort函数的用法。

#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;

typedef struct st {
    string name, id;
    int score;
} st;

bool stu_sort(st a, st b) { return a.score > b.score; }

int main() {
    int n;
    st stu[10010];
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> stu[i].name >> stu[i].id >> stu[i].score;
    }
    sort(stu, stu + n, stu_sort);
    cout << stu[0].name << ' ' << stu[0].id << endl;
    cout << stu[n - 1].name << ' ' << stu[n - 1].id;

    return 0;
}

7-3 日期类

分数 20
作者 xxxtentx

单位 江西财经大学

编写一个日期类,要求按 xxxx-xx-xx 的格式输出日期,实现加一天的操作。

输入格式:

第一行包含整数 T,表示共有 T 组测试数据。

每组数据占一行,包含 3 个用空格隔开的整数,分别表示年月日。

输出格式:

每组数据输出一行,一个结果,按 xxxx-xx-xx 的格式输出,表示输入日期的后一天的日期。

数据范围:

输入日期保证合法且不会出现闰年
年份范围 [1000,3000]

输入样例:

在这里给出一组输入。例如:

2
1999 10 20
2001 1 31

输出样例:

在这里给出相应的输出。例如:

1999-10-21
2001-02-01

日期类问题一直是模拟题中的难点,可以参考 https://www.acwing.com/blog/content/5918/ 来进行学习

#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
int T;
int months[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 得到某年某月的天数
int get(int year, int month) {
    if (month != 2)
        return months[month];
    else {
        // 2月
        int leap = (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
        return 28 + leap;
    }
}

void next_date(int year, int month, int date) {
    if (date == get(year, month)) {
        if (month == 12) {
            year++;
            month = 1;
        } else {
            month++;
        }
        date = 1;
    } else {
        date++;
    }
    printf("%04d-%02d-%02d\n", year, month, date);
}

int main() {
    cin >> T;
    while (T--) {
        int year, month, date;
        cin >> year >> month >> date;
        next_date(year, month, date);
    }
    return 0;
}

7-4 日期之差

分数 25

作者 江太白

单位 江西财经大学

给定两个日期,请你计算这两个日期之间有少天(定义连续的日期之差为2天)

输入格式:

共两行,每一行输入一个日期,日期格式为yyyy-MM-dd

输出格式:

一个正整数,为两个日期之间的差

输入样例:

2021-07-02
2021-07-15

输出样例:

14
#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
int T;
int months[] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
// 是否是闰年
bool leap(int year) {
    return (year % 4 == 0 && year % 100 != 0 || year % 400 == 0);
}
// 得到某年某月的天数
int get(int year, int month) {
    if (month != 2)
        return months[month];
    else {
        // 2月
        return 28 + leap(year);
    }
}

int main() {
    int year1, month1, date1;
    int year2, month2, date2;
    scanf("%d-%d-%d", &year1, &month1, &date1);
    scanf("%d-%d-%d", &year2, &month2, &date2);

    if (year1 == year2) {
        if (month1 == month2) {
            cout << abs(date2 - date1) + 1;
            return 0;
        } else if (month1 < month2) {
            int ans = 0;
            ans += get(year1, month1) - date1;
            for (int i = month1 + 1; i < month2; i++) ans += get(year1, i);
            ans += date2;
            cout << ans + 1<< endl;
            return 0;
        } else if (month1 > month2) {
            int ans = 0;
            ans += get(year1, month2) - date2;
            for (int i = month2 + 1; i < month1; i++) ans += get(year1, i);
            ans += date1;
            cout << ans + 1<< endl;
            return 0;
        }
    } else if (year1 < year2) {
        int ans = 0;
        ans += get(year1, month1) - date1;
        for (int i = month1 + 1; i <= 12; i++) ans += get(year1, i);
        for (int i = year1 + 1; i < year2; i++) ans += 365 + leap(i);
        for (int i = 1; i < month2; i++) ans += get(year2, i);
        ans += date2;
        cout << ans + 1 << endl;
    } else if (year1 > year2) {
        int ans = 0;
        ans += get(year2, month2) - date2;
        for (int i = month2 + 1; i <= 12; i++) ans += get(year2, i);
        for (int i = year2 + 1; i < year1; i++) ans += 365 + leap(i);
        for (int i = 1; i < month1; i++) ans += get(year1, i);
        ans += date1;
        cout << ans + 1 << endl;
        return 0;
    }
    return 0;
}

7-5 数字的菱形

分数 20

作者 xxxtentx

单位 江西财经大学

打印一个由数字 0∼n 构成的菱形。

其中 n 位于正中心,数字靠近边缘时逐个递减,直至为 0。

例如,当 n=5 时,图形如下所示:

          0
        0 1 0
      0 1 2 1 0
    0 1 2 3 2 1 0
  0 1 2 3 4 3 2 1 0
0 1 2 3 4 5 4 3 2 1 0
  0 1 2 3 4 3 2 1 0
    0 1 2 3 2 1 0
      0 1 2 1 0
        0 1 0
          0

现在,给定 n,请你打印相应菱形。

输入格式:

一个整数 n。

输出格式:

输出相应菱形。

数据范围:

2 ≤ n ≤ 9

输入样例:

在这里给出一组输入。例如:

2

输出样例:

在这里给出相应的输出(注意每一个数字后面都有一个空格)。例如:

    0     
  0 1 0   
0 1 2 1 0 
  0 1 0   
    0     

tips:第一行的0前面有4个空格,后面有5个空格

找规律的题目,规律与哈密顿距离有关(平面距离某一点的距离,就是那两个abs)

#include <algorithm>
#include <cstring>
#include <iostream>
using namespace std;
int g[11][11];
int main() {
    int n;
    cin >> n;
    for (int i = 0; i < 2 * n + 1; i++) {
        for (int j = 0; j < 2 * n + 1; j++) {
            int t = n - abs(i - n) - abs(j - n);
            if (t < 0)
                printf("  ");
            else
                printf("%d ", t);
        }
        puts("");
    }

    return 0;
}