- 西中经开联校 - 第 6 场周赛
【题解】西中经开联校 - 第 6 场周赛
- @ 2025-1-15 10:22:55
T1 起床时间
难度:简单数学题。
算法:模拟。
子任务 ( 分):由于 ,所以直接输出 和 就好。
子任务 ( 分):由于是刚好减去一个小时,所以直接输出 和 就好。
子任务 ( 分):有多种做法。
做法 :可以直接模拟时间变化,先把分钟数 减去 ,然后只要分钟数小于 ,就给小时数减少 ,分钟数加上 。由于 ,所以这个过程最多执行两次就可以,重复两次 语句判断即可。
做法 :我自己的习惯是先把“小时:分钟”的时间描述法转换为只有分钟的,即“小时数 × 分钟数” 这么多分钟。这样在同一天内就可以直接减去 ,再转回去即可。
C++ 代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int h, m, x;
cin >> h >> m >> x;
int ans = h * 60 + m - x;
cout << ans / 60 << " " << ans % 60 << endl;
return 0;
}
T2 联合ChatGPT
难度:简单的条件判断与求和。
算法:枚举。
子任务 ( 分):因为只有一道题,所以直接输出 和 中的较大值就好。
子任务 ( 分):因为保证了 所以直接输出所有 之和就好,简单的循环输入与求和。
子任务 ( 分):在子任务 的基础上,加上判断 哪个高算哪个就好。需要最后的答案可以达到 是超过了 int 的,需要使用 long long。
C++ 代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n, a, b;
cin >> n;
long long ans = 0;
for (int i = 1; i <= n; i ++ )
{
cin >> a >> b;
ans += max(a, b);
}
cout << ans << endl;
return 0;
}
T3 摩斯电码数数
难度:简单的字符串枚举,主要给大家提醒了一下转义符的使用。
算法:字符串处理,枚举。
子任务 ( 分):因为保证了不包含 \ 所以只有一个单词,只需要输出 即可。
子任务 ( 分):因编码长度为 ,所以答案就是 (s.size()+1)/6。
子任务 ( 分):单词数就是 \ 数量加一。记住反斜杠本身也是个特殊字符,需要用转义模式 \\ 表示即可。
C++ 代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
string s;
cin >> s;
int ans = 0;
for (int i = 0; i < s.size(); i ++ )
if (s[i] == '\\')
ans ++ ;
cout << ans + 1 << endl;
return 0;
}
T4 校门外好多树
难度:数组综合应用。
算法:模拟。
子任务 ( 分):因为 ,所以在完成了基础的暴力枚举标记所有有数的位置后,就是一个弱化版的“最长平台”问题,有几段树答案就是几。统计多少个位置有树且前一个位置没树即可(第一个位置特殊判断)。
子任务 ( 分):每次不再是区间修改而是单点修改了。没学过循环嵌套的同学也可以获得这部分分数。
子任务 ( 分):如果是数据范围更大,就需要使用差分的方式处理。但是数据范围这么小,直接暴力标记每个位置有没有树即可。标记完后,问题就变成了判断有几段树的数量达到了 。
C++ 代码:
#include <bits/stdc++.h>
using namespace std;
int L, M, x;
bool a[5005];
int main()
{
cin >> L >> M >> x;
for (int i = 0; i <= L; i ++ ) a[i] = true;
while (M --)
{
int l, r;
cin >> l >> r;
for (int j = l; j <= r; j ++ )
a[j] = false;
}
int now = 0, ans = 0;
for (int i = 0; i <= L; i ++ )
{
if (a[i] == true)
now ++ ;
else
{
if (now >= x)
ans ++ ;
now = 0;
}
}
if (now >= x) ans ++ ;
cout << ans << endl;
return 0;
}