📅  最后修改于: 2023-12-03 14:58:34.775000             🧑  作者: Mango
这是一道来自 1996 年 "门|门" 考试的题目,题目编号为 46。题目背景并不是很明确,但可以看出是由三个子问题组成,比较考验细节问题的处理。
题目包含以下三个小问题:
HH:MM
,请输出最早和最晚的时间。YYYY-MM-DD
,请输出它是当年的第几天。问题一其实就是一个找最值的问题。一个比较简单的方法是把所有的时间转换成分钟数,然后找到最小值和最大值再转回时间。具体做法:
"HH:MM"
的格式读入,分别用变量 hour
和 minute
保存小时和分钟数。minute + hour * 60
把时间转换成分钟数,记为 time
。min_time
和 max_time
分别记录最小和最大的 time
值。min_time
和 max_time
转换成 "HH:MM"
的格式输出即可。问题二更像是一个字符串处理的问题。一个常见的做法是用一个长度为 12 的数组 days
存储每个月的天数,然后把日期字符串分成三个部分,再根据年份判断是否是闰年,从而计算出来这是当年的第几天。具体做法:
days
,数组下标表示月份,数组元素表示这个月的天数。注意 2 月特殊处理。strtok()
函数把日期字符串按 '-'
分隔成三个部分。分别用变量 year
、month
和 day
保存。days[2]
的值设为 29。month-1
,每次累加 days[i]
的值。day
的值。问题三是一个比较经典的计算几何问题,可以使用暴力枚举、分治算法、基于树的算法等多种方法。这里介绍一个暴力枚举的做法。
fabs(d1-d2) < epsilon
来判断 d1
和 d2
是否相等。min_dist
,初始值设为一个比较大的数,比如 $10^9$。然后遍历所有的点对,找到距离最小的那个,并更新 min_dist
的值。遍历完成后,min_dist
即为所求。min_dist
输出即可。#include <iostream>
#include <string>
using namespace std;
int main() {
int min_time = 24 * 60, max_time = 0;
string s;
while (cin >> s) {
int hour = stoi(s.substr(0, 2));
int minute = stoi(s.substr(3, 2));
int time = hour * 60 + minute;
min_time = min(min_time, time);
max_time = max(max_time, time);
}
printf("%02d:%02d %02d:%02d", min_time / 60, min_time % 60, max_time / 60, max_time % 60);
return 0;
}
#include <iostream>
#include <cstring>
using namespace std;
int main() {
int days[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
string s;
cin >> s;
char *year = strtok(&s[0], "-");
char *month = strtok(NULL, "-");
char *day = strtok(NULL, "-");
int y = atoi(year), m = atoi(month), d = atoi(day);
if ((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) days[2] = 29;
int ans = 0;
for (int i = 1; i < m; i++) {
ans += days[i];
}
ans += d;
printf("%d", ans);
return 0;
}
#include <iostream>
#include <cmath>
using namespace std;
const int MAXN = 10005;
const double EPS = 1e-8;
int x[MAXN], y[MAXN];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
cin >> x[i] >> y[i];
}
double min_dist = 1e9;
for (int i = 1; i <= n; i++) {
for (int j = 1; j < i; j++) {
double dx = x[i] - x[j];
double dy = y[i] - y[j];
double dist = sqrt(dx * dx + dy * dy);
if (dist - min_dist < EPS) {
min_dist = dist;
}
}
}
printf("%.2lf", min_dist);
return 0;
}