Hướng dẫn giải của [Free Contest 06] EXAM2
Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.
Hướng dẫn giải
Cho thời điểm nhận đề A, thời điểm nộp bài B (hh:mm:ss) và số phút làm bài t. Khoảng cách giữa A và B nằm trong [1 giây, 1 ngày]. Kiểm tra An làm xong đúng giờ (Perfect), phải xin thêm 1 giờ (Extra), hay phải thi lại (Fail).
Sub 1: Tính khoảng cách và so sánh — ~O(1) mỗi test~
Đổi A, B ra số giây trong ngày. Khoảng cách là (B - A) mod 86400; nếu bằng 0 thì khoảng cách là đúng 1 ngày = 86400 giây. Thời gian cần là t·60 giây. Nếu cần ≤ khoảng cách thì Perfect; nếu cần ≤ khoảng cách + 3600 thì Extra; còn lại Fail. Lưu ý dùng scanf thống nhất để đọc định dạng hh:mm:ss.
Kết quả chấm: 2/2 (PASS 2/2)
#include <bits/stdc++.h>
using namespace std;
// Doi "hh:mm:ss" ra so giay trong ngay
long long toSec(int h, int m, int s) { return h * 3600LL + m * 60LL + s; }
int main() {
if (fopen("exam.in", "r")) { freopen("exam.in", "r", stdin); freopen("exam.out", "w", stdout); }
int n;
scanf("%d", &n); // dung scanf thong nhat, khong tron voi cin
while (n--) {
int h1, m1, s1, h2, m2, s2;
long long t;
scanf("%d:%d:%d %d:%d:%d %lld", &h1, &m1, &s1, &h2, &m2, &s2, &t);
long long A = toSec(h1, m1, s1), B = toSec(h2, m2, s2);
// Khoang thoi gian lam bai: (B - A) mod 1 ngay; neu bang 0 thi la dung 1 ngay (86400 giay)
long long gap = ((B - A) % 86400 + 86400) % 86400;
if (gap == 0) gap = 86400;
long long need = t * 60; // can need giay de lam xong
if (need <= gap) printf("Perfect\n");
else if (need <= gap + 3600) printf("Extra\n"); // xin them 1 gio
else printf("Fail\n");
}
return 0;
}
Bình luận