语法周赛 Round 11 题解
2024年12月25日大约 4 分钟
温暖的签到题001
- 子任务 1(30 分):由于
,所以要么不额外开销,要么只额外开销一次,随便判断一下即可。 - 子任务 2(30 分):保证了
,所以直接计算 即可,需要注意int
类型存储不下,需要使用long long
。 - 子任务 3(40 分):此时
的大小不一定,显然要花的钱有 ,算一下多少天花额外的 即可,额外花钱的天数显然是 。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll n, x, y, t = 1;
int main()
{
cin >> n >> x >> y;
cout << n * x + (n / 7) * y << '\n';
return 0;
}
温暖的签到题002
- 子任务 1(30 分):由于
,只要判断 是不是最小值即可,用 和后面每组的 比较。 - 子任务 2(30 分):保证了
,所以直接比较 TooY0ung 和其唯一的对手谁更小即可。 - 子任务 3(40 分):如果会写子任务 1,写出来子任务 3 应该也没什么难度,循环求
和 的最小值 ,最后判断 是否等于 即可。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int a, b, c, minn, x, y, n;
int main()
{
cin >> x >> y;
cin >> n;
minn = x + y;
for(int i = 1; i <= n; i++)
{
cin >> a >> b >> c;
minn = min(minn , a + b + c);
}
if(minn == x + y) cout << "Yes" << '\n';
else cout << "No" << '\n';
return 0;
}
温暖的签到题003
- 子任务 1(30 分):保证以<开始和保证>结束,子任务其实是主要为了读错题的同学设置的,有的同学以为是自己曾经做过这个题,然后代码中会直接判断中间是否都是=,这样代码就大错特错了,如果发现子任务1无法通过,再次仔细读题就可以发现题目没有读对。
- 子任务 2(30 分):保证了没有字符 '=',那么就直接输出 'No' 好了。
- 子任务 3(40 分):如果会写子任务1,写出来子任务3应该没有什么难度,可以先找 '<',找到后判断其下一个是否为 '=',然后再用循环去找是否存在一些个连续的 '=',在最后一个 '=' 下一个又出现 '>' 即可。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
string s;
int main()
{
cin >> s;
int len = (int) s.size();
for(int i = 0; i < len; i++)
{
if(s[i] == '<' && s[i+1] == '=')
{
for(int j = i + 1; j < len - 1; j++)
{
if(s[j] == '=' && s[j+1] == '>')
{
cout << "Yes" << '\n';
return 0;
}
if(s[j+1] != '=') break;
}
}
}
cout << "No" << '\n';
return 0;
}
温暖的签到题004
- 子任务 1(30 分):保证了是
年,就不需要判断闰年了, 年一定是闰年。 - 子任务 2(30 分):保证了不存在跨天,就不需要判断跨天了。
- 子任务 3(40 分):正解其实就是分类讨论。
- 当前时间大于等于开始营业时间并小于结束时间,答案显然就是输出现在的日期和时间。
- 当前时间大于等于开始营业时间并且结束时间小于开始时间,答案显然还是现在的日期和时间。
- 结束时间小于开始时间并且当前时间小于结束时间,答案显然还是现在的日期和时间。
- 现在时间小于开始时间,答案显然就是现在的日期和开始时间。
- 其余情况需要第二天开始时间再来,进行第二天的日期计算即可。
其中,第二天的日期计算,涉及到月份和闰年的计算,只要把细节都注意就行了,主要的坑点有,跨月份的情况,跨年份的情况,注意用
#include<bits/stdc++.h>
#define ll long long
int dy[2][12]={{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
{31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};
int judge(int y)
{
if(y % 4 == 0 && y % 100 != 0) return 1;
if(y % 400 == 0) return 1;
return 0;
}
int yy, mo, dd, hh, mm, ss, a, b, c, d, e, f;
int main()
{
scanf("%d-%d-%d", &yy, &mo, &dd);
scanf("%d:%d:%d", &hh, &mm, &ss);
scanf("%d:%d:%d", &a, &b, &c);
scanf("%d:%d:%d", &d, &e, &f);
int now = ss + 60 * mm + 3600 * hh;
int st = c + 60 * b + 3600 * a;
int ed = f + 60 * e + 3600 * d;
if((now >= st && now < ed)||(now >= st && ed <= st)||(ed <= st && now < ed))
{
printf("%d-%02d-%02d %02d:%02d:%02d\n", yy, mo, dd, hh, mm, ss);
}
else if(now < st)
{
printf("%d-%02d-%02d %02d:%02d:%02d\n", yy, mo, dd, a, b, c);
}
else
{
int t = dy[judge(yy)][mo - 1];
dd++;
if(dd > t)
{
mo++; dd = 1;
if(mo > 12)
{
yy++; mo = 1;
}
}
printf("%d-%02d-%02d %02d:%02d:%02d\n", yy, mo, dd, a, b, c);
}
return 0;
}