A Calandar题解 - 2019年第十届“浪潮杯”SDCPC山东大学生程序设计大赛 正式赛

A Calandar

题目链接(可提交代码)

codeforces

PTA

题目大意

有一个星球,每年12个月,每月30天,每周5天。提供多组数据,给一个日期告诉你是周几,求另一个日期是周几。

吐槽一下

Calendar是日历的意思,不知道题目为什么是Calandar,也许因为是另一颗星球?

解题思路

参考思路:2019年第十届“浪潮杯”山东省大学生ACM程序设计竞赛–解题报告

一开始想的是用年月日之间间隔天数来算,后来看了网上大佬的思路,发现并不需要。

  • 一周只有5天,一月30天,30%5==0,所以月年都能省略,只需要看日就可以了。

  • 有两种情况,新日期在旧日期之前之后,记得处理就行。

为了代码好写少写好理解一点,还可以进行轻微的简化

  • 正常想法是将周几所对应的英文与字符串下标对应起来存。但是这样的话取余5时需要考虑是周五时的情况,要进行额外的操作来处理。
  • 其实可以直接将字符串下标0存“Friday”,因为5%5==0,正好对应,会好处理一点。
  • 看一下下面的两段代码就可以理解了。

参考代码c++

#include 
using namespace std;

string s, cal[6] = {"", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
int T, y, d1, d2, res, d;

int main() {
	cin >> T;
	while (T--) {
		cin >> y >> y >> d1 >> s;
		cin >> y >> y >> d2;
		for (int i = 1; i <= 5; i++) {
			if (s == cal[i]) {
				res = i;
				break;
			}
		}
		d = (d2 - d1) % 5;
		if (d < 0) {
			d += 5;
		}
		res = (res + d - 1) % 5 + 1;
		cout << cal[res] << endl;
	}
	return 0;
}

参考代码c++(轻微简化)

#include 
using namespace std;

string s, cal[6] = {"Friday", "Monday", "Tuesday", "Wednesday", "Thursday"};//将字符串下标0存“Friday”
int T, y, d1, d2, res, d;

int main() {
	cin >> T;
	while (T--) {
		cin >> y >> y >> d1 >> s;
		cin >> y >> y >> d2;
		for (int i = 0; i <= 4; i++) {
			if (s == cal[i]) {
				res = i;
				break;
			}
		}
		d = (d2 - d1) % 5;
		if (d < 0) {
			d += 5;
		}
		res = (res + d) % 5;//5%5==0正好对应周五时的情况,代码会好写少写好理解一点点
		cout << cal[res] << endl;
	}
	return 0;
}

参考代码c++(再次简化)

#include 
using namespace std;

string s, cal[6] = {"Friday", "Monday", "Tuesday", "Wednesday", "Thursday"};
int T, y, d1, d2, res, d;

int main() {
	cin >> T;
	while (T--) {
		cin >> y >> y >> d1 >> s;
		cin >> y >> y >> d2;
		for (int i = 0; i <= 4; i++) {
			if (s == cal[i]) {
				res = i;
				break;
			}
		}
		d = (d2 - d1 + 30) % 5;//因为两日期最多差29天,所以加上30就能保证不会出现负数,就省去负数时的处理了
		res = (res + d) % 5;
		cout << cal[res] << endl;
	}
	return 0;
}

参考代码c++(再再次简化)

#include 
using namespace std;

string s, cal[6] = {"Friday", "Monday", "Tuesday", "Wednesday", "Thursday"};
int T, y, d1, d2, res;

int main() {
	cin >> T;
	while (T--) {
		cin >> y >> y >> d1 >> s;
		cin >> y >> y >> d2;
		for (int i = 0; i <= 4; i++) {
			if (s == cal[i]) {
				res = i;
				break;
			}
		}
		res = (res + d2 - d1 + 30) % 5;//合并写在一起好了,反正数据范围不大
		cout << cal[res] << endl;
	}
	return 0;
}

参考代码c++(再再再次简化)

#include 
using namespace std;

string s, cal[6] = {"Friday", "Monday", "Tuesday", "Wednesday", "Thursday"};
int T, y, d1, d2, res;

int main() {
	cin >> T;
	while (T--) {
		cin >> y >> y >> d1 >> s;
		cin >> y >> y >> d2;
		for (int i = 0; i <= 4; i++) {
			if (s == cal[i]) {
				res = i;
				break;
			}
		}
		cout << cal[(res + d2 - d1 + 30) % 5] << endl;//写进去拉倒
	}
	return 0;
}

参考代码c++(再再再再次简化)

#include 
using namespace std;

string s, cal[6] = {"Friday", "Monday", "Tuesday", "Wednesday", "Thursday"};
int T, y, d1, d2;

int main() {
    cin >> T;
	while (T--) {
		cin >> y >> y >> d1 >> s;
		cin >> y >> y >> d2;
		for (int i = 0; i <= 4; i++) {
			if (s == cal[i]) {
				cout << cal[(i + d2 - d1 + 30) % 5] << endl;//放进来就得了
				break;
			}
		}
	}
	return 0;
}

参考代码c++(极简风格)

#include 
using namespace std;

string s, cal[6] = {"Friday", "Monday", "Tuesday", "Wednesday", "Thursday"};
int T, a, b;//就这么几个参数就行,其他都用不上

int main() {
    cin >> T;
    while (T--) {
        cin >> b >> b >> a >> s;
        cin >> b >> b >> b;
        for (int i = 0; i < 5; i++) {
            if (s == cal[i]) {
                cout << cal[(i + b - a + 30) % 5] << endl;
                break;
            }
        }
    }
    return 0;
}

你可能感兴趣的:(编程题-题解,算法,c++,学习)