2023短学期0908题解

发布时间 2023-09-08 15:38:18作者: yoongii

简单算术

Description

计算数列1 - 1/3 + 1/5 - 1/7 + 1/9 - 1/11 + …的前n项之和。

Input

输入有多组数据

输入一个正整数n。

Output

输出数列前n项的和。输出保留5位小数。

Samples

input
10 100000 5 1995
output
0.76046 0.78540 0.83492 0.78552

点击查看代码
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;

int main() {
    int n=0;
    while (cin >> n) {
        double sum = 0.0;
        int sign = 1;
        for (int i = 0; i < n; i++) {
            double term = 1.0 / (2 * i + 1);
            sum += sign * term;
            sign *= -1;
        }
        cout << fixed << setprecision(5) << sum << endl;
    }
    return 0;
}

同班同学

Description

zhengling知道很多生活小常识,比如如果我们是一个班的,那么我们手机号前面的几位数字一定是相同的,并且我们的电话号码长度是一样的。

Input

输入N,表示有N个同学,接下来输入N行字符串表示每个同学的手机号。其中N<30,所有手机号码数据长度小于30。

Output

假设所有N同学都是一个班的,请输出他们的手机号前面到底有多少位是相同的。

Samples

input
4 00209 00219 00999 00909
output
2

点击查看代码
#include <iostream>
#include <string>
using namespace std;

int main() {
    int n=0,m=0;
    string phoneNumber[31];
    cin >> n;
    for (int i = 0; i < n; i++) {
        cin >> phoneNumber[i];
    }
    int commonPrefix = 0;
    bool stop = false;
    while (!stop) {
        char currentDigit = phoneNumber[0][commonPrefix];//纵向比较
        for (int i = 1; i < n; i++) {
            if (phoneNumber[i][commonPrefix] != currentDigit) {
                stop = true;
                break;
            }
        }
        if (!stop) {
            commonPrefix++;
        }
    }
    cout << commonPrefix << endl;
    return 0;
}

花雕恋

Description

我爱睡觉觉群里的花和雕很爱聊天。但是他们每天固定的上线时间并不同。给出他们每天固定的在线时间段,请问一天中他们能聊几个小时。

Input

第一行输入一个T,代表有T组测试数据。

每组测试数据输入n(n代表花花在线的区间个数),m(代表雕在线的区间个数)

接下来n行输入区间[a,b] 代表花花的在线区间.接下来m行输入区间[c,d]代表雕的在线区间.时间范围为(0-23)。

注意:是闭区间,so,比如10-13,指花花10,11,12,13四个小时都在线

Output

这一天他们可以聊天的总时间。

Samples

input
1 3 2 10 13 14 17 20 23 13 15 21 23
output
6

                <h2>Hint</h2>
        <p>
        注意输入的时段可能会重合,比如10 13,10 12
        </p>
点击查看代码
#include <iostream>
#include <algorithm>
using namespace std;
int main() {
    int T;
    std::cin >> T;

    while (T--) {
        int n, m;
        std::cin >> n >> m;

        int flower_intervals[50][2];
        int sculpture_intervals[50][2];

        for (int i = 0; i < n; ++i) {
            cin >> flower_intervals[i][0] >> flower_intervals[i][1];
        }

        for (int i = 0; i < m; ++i) {
            cin >> sculpture_intervals[i][0] >> sculpture_intervals[i][1];
        }

        int total_time = 0;
        int time[24] = { 0 };

        for (int i = 0; i < n; ++i) {
            for (int j = flower_intervals[i][0]; j <= flower_intervals[i][1]; ++j) {
                time[j] = 1;
            }
        }

        for (int i = 0; i < m; ++i) {
            for (int j = sculpture_intervals[i][0]; j <= sculpture_intervals[i][1]; ++j) {
                if (time[j] == 1) {
                    total_time++;
                }
            }
        }

        cout << total_time << endl;
    }

    return 0;
}

超简版贪吃蛇

Description

据说软工的同学们短学期写贪吃蛇写得很欢乐,为了将这份快乐延续下去,故有了这道超级简化版的贪吃蛇题目。

本题中,地图为一个$n*m$的网格,坐标原点在左上角,$x$轴方向向下,$y$轴方向向右。

贪吃蛇初始位置为$(x,y)$,运动方向向右,长度永远为一个格子。

初始时间为$0$,从第$1$秒开始,贪吃蛇每秒会向当前的方向运动一格。

在运动过程中,玩家会随时改变贪吃蛇的方向。

例如,玩家如果在第$0$秒按下了上键,那么在第$1$秒贪吃蛇的位置就是$(x-1,y)$。若玩家在第$0$秒不操作,那么贪吃蛇默认向右,第$1$秒的位置为$(x,y+1)$。

另外,地图的边界是可以穿越的,如果贪吃蛇在$(0,y)$往上走了一格,它就会出现在$(n-1,y)$,其他边界类似。

现在,给你玩家的操作序列,请你输出第$t$秒时,贪吃蛇所在的位置。


Input

有多组测试数据,对于每组测试数据:

首先$5$个整数$n,m,x,y,t(x < n \leq 100,y < m \leq 100,t \leq 10000)$表示地图大小、初始位置和最后的时间。

然后一个$q(q \leq 100)$表示用户操作次数。

接下来$q$行,每行两个整数$dir,time(0 \leq time < 10000)$分别表示方向和用户按下按键的时间。

其中,$dir = 0$表示向上,$1$向下,$2$向左,$3$向右,不会有其他的值。

$time$表示用户进行本次操作所处的时间,例如$time = 0$就表示用户在第$0$秒进行了这次操作,注意$time$有可能大于$t$。

输入保证$time$是递增的。

输入$5$个$0$表示程序结束。


Output

对于每组样例,输出两个整数$x, y$,表示贪吃蛇在第$t$秒的坐标。

Samples

input
3 3 0 0 0 0 3 3 0 0 1 1 0 0 7 2 4 1 50 8 0 10 1 20 1 24 3 25 0 30 2 33 3 39 2 48 0 0 0 0 0
output
0 0 2 0 3 1

点击查看代码
#include <iostream>
using namespace std;

int main() {
    int n, m, x, y, t;
    while (cin >> n >> m >> x >> y >> t, n || m || x || y || t) {
        int dir[10001][2] = { 0 };
        dir[0][0] = 3; // 初始方向向右
        int q;
        cin >> q;
        for (int i = 0; i < q; i++) {
            int d, time;
            cin >> d >> time;
            dir[time][0] = d;
            dir[time][1] = 1; // 标记这个时间点改变了方向
        }
        for (int i = 1; i <= t; i++) {
            if (!dir[i][1]) { // 如果这个时间点没有改变方向
                dir[i][0] = dir[i - 1][0]; // 方向和上一秒保持一致
            }
        }
        for (int i = 0; i < t; i++) {
            switch (dir[i][0]) {
            case 0: 
                x--; 
                break;
            case 1: 
                x++; 
                break;
            case 2: 
                y--; 
                break;
            case 3: 
                y++; 
                break;
            }
            if (x < 0) 
                x = n - 1;
            if (x >= n) 
                x = 0;
            if (y < 0) 
                y = m - 1;
            if (y >= m) 
                y = 0;
        }
        cout << x << " " << y << endl;
    }
    return 0;
}