50pts求助
查看原帖
50pts求助
583610
DrAlfred楼主2022/9/24 13:14
#include <bits/stdc++.h>
using namespace std;
// 一天有多少个等差数列
const int singleDay = 31;
// 每小时(12-11) 有几个等差数列
const int hourSum[] = {1, 5, 5, 4, 4, 3, 3, 2, 2, 1, 0, 1};
// 每小时中等差数列的分钟
const int matchMinute[20][10] = {
    {34},
    {11,23,35,47,59},
    {10,22,34,46,58},
    {21,33,45,57},
    {20,32,44,56},
    {31,43,55},
    {30,42,54},
    {41,53},
    {40,52},
    {50},
    {-114514},
    {11},
};
inline long long solve(int time) {
    // 计算经过了几天
    int daysum = time / 60 / 12;
    // 计算经过(完全覆盖)了哪些小时
    int coverhour = (time - daysum * 60 * 12) / 60;
    // 计算还剩下多少分钟
    int leftMinute = time % 60, iter = 0;
    long long _retval = daysum * singleDay; // 首先是天数*每天
    for (int i = 0; i < coverhour; i++) {
        _retval += hourSum[i];  // 计算覆盖的小时
    }
    // 计算剩下的分钟
    for (int i = 0; i <= leftMinute; i++) {
        if (matchMinute[coverhour][iter] == i) {
            ++iter;
            ++_retval;
        }
    }
    return _retval;
}
int main(int argc, char const *argv[]) {
    int d, t;
    scanf("%d", &d);
    while (d--) {
        scanf("%d", &t);
        printf("%lld\n", solve(t));
    }
    system("pause");
    return 0;
}

2022/9/24 13:14
加载中...