偶数场周赛较难,奇数场周赛较易。

T1 温暖的签到题001

难度:没有难度,简单数学计算。

算法:数学,模拟。

子任务 113030 分):由于 n7n≤7,所以要么不额外开销,要么只额外开销一次,随便判断一下即可。

子任务 223030 分):保证了 y=0y=0,所以直接计算 nxn*x 即可,需要注意 int 类型存储不下,需要使用 long long

子任务 334040 分):此时 x,yx,y 的大小不一定,显然要花的钱有 nxn*x,算一下多少天花额外的 yy 即可,额外花钱的天数显然是 n/7⌊n/7⌋

C++ 代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

LL n, x, y, t = 1;

int main()
{
    cin >> n >> x >> y;
    cout << n * x + (n / 7) * y << endl;
    
    return 0;
}

T2 温暖的签到题002

难度:循环、求和、求最小值。

算法:模拟。

子任务 113030 分):由于 x=0x=0,只要判断 yy 是不是最小值即可,用 yy 和后面每组的 a+b+ca+b+c 比较。

子任务 223030 分):保证了 n=1n=1,所以直接比较 Csvoner 和其唯一的对手谁更小即可。

子任务 334040 分):如果会写子任务 11,写出来子任务 33 应该也没什么难度,循环求 a+b+ca+b+cx+yx+y 的最小值 minn,最后判断 minn 是否等于 x+yx+y 即可。

C++ 代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

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" << endl;
	else cout << "No" << endl;
    
    return 0;
}

T3 温暖的签到题003

难度:循环、字符串。

算法:字符串处理。

子任务 113030 分):保证以 < 开始和保证 > 结束,子任务其实是主要为了读错题的同学设置的,有的同学以为是自己曾经做过这个题,然后代码中会直接判断中间是否都是 =,这样代码就大错特错了,如果发现子任务 11 无法通过,再次仔细读题就可以发现题目没有读对。

子任务 223030 分):保证了没有字符 =,那么就直接输出 No 好了。

子任务 334040 分):如果会写子任务 11,写出来子任务3应该没有什么难度,可以先找 <,找到后判断其下一个是否为 =,然后再用循环去找是否存在一些个连续的 =,在最后一个 = 下一个又出现 > 即可。

C++ 代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

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" << endl;
	    			return 0;
				}
				if (s[j + 1] != '=') break;
			}
		}
	}
	
	cout << "No" << endl;
    
    return 0;
}

T4 温暖的签到题004

难度:有那么一点点麻烦的分类讨论,日期和时间判断。

算法:模拟。

子任务 113030 分):保证了是 20242024 年,就不需要判断闰年了,20242024 年一定是闰年。

子任务 223030 分):保证了不存在跨天,就不需要判断跨天了。

子任务 334040 分):正解其实就是分类讨论。

1.当前时间大于等于开始营业时间并小于结束时间,答案显然就是输出现在的日期和时间。

2.当前时间大于等于开始营业时间并且结束时间小于开始时间,答案显然还是现在的日期和时间。

3.结束时间小于开始时间并且当前时间小于结束时间,答案显然还是现在的日期和时间。

4.现在时间小于开始时间,答案显然就是现在的日期和开始时间。

5.其余情况需要第二天开始时间再来,进行第二天的日期计算即可。其中,第二天的日期计算,涉及到月份和闰年的计算,只要把细节都注意就行了,主要的坑点有,跨月份的情况,跨年份的情况,注意用 00 补齐两位数。

C++ 代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;

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;
}

0 comments

No comments so far...