日期相关整理

3214. 节日

有一类节日的日期并不是固定的,而是以“a 月的第 b 个星期 c ”的形式定下来的,比如说母亲节就定为每年的五月的第二个星期日。

现在,给你 a,b,c 和 y1,y2,希望你输出从公元 y1 年到公元 y2 年间的每年的 a 月的第 b 个星期 c 的日期。

提示:关于闰年的规则:年份是 400 的整数倍时是闰年,否则年份是 4 的倍数并且不是 100 的倍数时是闰年,其他年份都不是闰年。

例如 1900 年就不是闰年,而 2000 年是闰年。

为了方便你推算,已知 1850 年 1 月 1 日是星期二。

输入格式

输入包含恰好一行,有五个整数 a,b,c,y1,y2。

其中 c=1,2,……,6,7 分别表示星期一、二、……、六、日。

输出格式

对于 y1 和 y2 之间的每一个年份,包括 y1 和 y2,按照年份从小到大的顺序输出一行。

如果该年的 a 月第 b 个星期 c 确实存在,则以 yyyy/mm/dd 的格式输出,即输出四位数的年份,两位数的月份,两位数的日期,中间用斜杠 / 分隔,位数不足时前补零。

如果该年的 a 月第 b 个星期 c 并不存在,则输出 none

#include <bits/stdc++.h>

using namespace std;

int months[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
//将月份与天数对应

int is_leap(int y)  //如果当前年为闰年返回1,否则返回0
{
    if (y % 400 == 0 || y % 4 == 0 && y % 100) return 1;
    return 0;
}

int get_days(int y, int m)  //返回当前月共有多少天
{
    if (m == 2) return months[m] + is_leap(y);
    return months[m];
}

int main()
{
    int a, b, c, y1, y2;
    cin >> a >> b >> c >> y1 >> y2;

    int days = 0;  //记录当前天距离1850.1.1有多少天
    for (int y = 1850; y <= y2; y ++)
        for (int m = 1; m <= 12; m ++)
        {
            if (y >= y1 && m == a)  //到所求月份
            {
                int w = (1 + days) % 7, cnt = 0;  //w为当前月第一天的星期几
                                                  //注1850.1.1是星期二,所以加1
                for (int d = 1; d <= get_days(y, m); d ++)
                {
                    if (w == c - 1)  //0,1,2,,,6分别表示星期1到7
                    {
                        cnt ++;
                        if (cnt == b) 
                        {
                            printf("%04d/%02d/%02d\n", y, m, d);
                            break;
                        }
                    }
                    w = (w + 1) % 7;
                }
                if (cnt < b) puts("none");
            }
            days += get_days(y, m);
        }
    
    return 0;
}

3254. Crontab

Cron (源自希腊语 χρόνοςχρόνος,意思是时间〉是类 Unix 系统下基于时间的任务调度器,用于在固定的时间运行指定的任务(多为系统管理和维护的任务)。

Cron 适合于周期性重复调度的任务,通过crontab文件来描述调度任务的配置。

Crontab文件由若干行组成,每行是一条配置信息,格式如下:

<minutes> <hours> <day of month> <month> <day of week> <command>

表示在满足前 5 项所指定的时间来运行第 6 项 <command> 所描述的命令。

前 55 项用于描述时间,含义和取值范围如下:

  • <minutes> 是分钟数,取值范围是 0−59;
  • <hours> 是小时数,取值范围是 0−23;
  • <day of month> 是月份中的天数,取值范围是 1−31;
  • <month> 是月份,取值范围是 1−12,或 Jan - Dec ;
  • <day of week> 是星期几,取值范围是 0−6,或 Sun - Sat

对于前 5 项,除了可以直接给出数字或者英文缩写(不区分大小写)外,还可以出现星号 *(表示任何取值)、逗号 , (表示多个不同的取值)或减号 - (表示一段连续的取值范围)。

星号只能单独出现,减号和逗号可以配合出现。

Cron 每分钟检查一次系统时间,当系统时间同时满足这 5 项要求时,cron 将执行对应的命令。

给出一个时间段,以及一个 crontab 文件,请你编程输出在这段时间内的任务调度执行情况。

输入格式

输入第一行有 33 个整数 n、s、t,用空格分隔。n 表示接下来有 n 行,描述一个 crontab 文件。s 和 t 分别为系统运行的开始时间(包含)和结束时间(不包含),格式为 yyyymmddHHMM(年、月、日、小时、分钟)。

接下来有 n 行,每行是一条 crontab 配置信息,相邻两项之间用一个空格分隔。

输出格式

输出有若干行,每行表示一个任务调度,由两部分构成︰第一部分是任务调度的时间,格式同样为 yyyymmddHHMM,第二部分是调度执行的命令。

两部分之间用一个空格分隔。

按照时间先后顺序输出。

如果同一时刻有多条命令满足调度条件,则按照输入给出的顺序输出

数据范围

输入数据约定:

  • 1≤n≤20,s≤t
  • 输入数据中给出的时间均在 1970-01-01 00:00 到 2099-12-31 23:59 之间。
  • 输入中给出的命令只包含大小写字母、数字和下划线 _,不包含空格或其他符号。
  • 保证输入中描述时间的部分都是合法的。对于减号描述的时间范围 x−y,一定满足 x≤y。英文缩写的拼写保证是正确的。英文缩写和数值可以混合使用。分钟数和小时数可以有前导 0,也可以没有(例如,00 和 0 都是合法的输入),其他部分不会出现前导 0。
  • 输入的每行不超过 100 个字符。
  • 保证输出内容不超过 10000 行。
  • 提示:1970 年 1 月 1 日是星期四。

输入数据特征(√ 表示可以出现,× 表示不会出现)∶

QQ截图20210208111813.png

附:月份与星期的英文缩写对照表:

QQ截图20210208111913.png

QQ截图20210208111937.png

输入样例:

3 201711170032 201711222352
0 7 * * 1,3-5 get_up
30 23 * * Sat,Sun go_to_bed
15 12,18 * * * have_dinner

输出样例:

201711170700 get_up
201711171215 have_dinner
201711171815 have_dinner
201711181215 have_dinner
201711181815 have_dinner
201711182330 go_to_bed
201711191215 have_dinner
201711191815 have_dinner
201711192330 go_to_bed
201711200700 get_up
201711201215 have_dinner
201711201815 have_dinner
201711211215 have_dinner
201711211815 have_dinner
201711220700 get_up
201711221215 have_dinner
201711221815 have_dinner

样例解释

样例输入给出了 3 条 cron 配置信息,系统运行的开始时间是 2017-11-17 00:32(包含),结束时间为 2017-11-22 23:52(不包含)。

每条配置信息的含义如下:
1.在星期一、三、四、五的 7 点整运行 get_up 命令。
2.在星期六、星期天的 23 点 30 分运行 go_to_bed 命令。
3.在每天的 12 点 15 分和 18 点 15 分运行 have_dinner 命令。

#include <bits/stdc++.h>

using namespace std;

int n;
int months[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

struct Timer
{
    int year, month, day, hour, minute, week;
    Timer(string str)
    {
        sscanf(str.c_str(), "%04d%02d%02d%02d%02d", &year, &month, &day, &hour, &minute);
        //c_str() 将const string*类型 转化为const char*类型
    }
    bool operator< (const Timer &t)const  //set
    {
        if (year != t.year) return year < t.year;
        if (month != t.month) return month < t.month;
        if (day != t.day) return day < t.day;
        if (hour != t.hour) return hour < t.hour;
        return minute < t.minute;
    }
    int is_leap()
    {
        if (year % 400 == 0 || (year % 100 && year % 4 == 0)) return 1;
        return 0;
    }
    int get_days()
    {
        if (month == 2) return months[2] + is_leap();
        return months[month];
    }
    void next()
    {
        if (++ minute == 60)
        {
            minute = 0;
            if (++ hour == 24)
            {
                week = (week + 1) % 7;
                hour = 0;
                if (++ day > get_days())
                {
                    day = 1;
                    if (++ month == 13)
                    {
                        month = 1;
                        year ++;
                    }
                }
            }
        }
    }
    string to_string()
    {
        char str[20];
        sprintf(str, "%04d%02d%02d%02d%02d", year, month, day, hour, minute);
        return str;
    }
};

struct Task
{
    bool minutes[60], hours[24], day_of_month[32], month[13], day_of_week[7];
    string name;
    bool check(Timer &t)
    {
        return minutes[t.minute] && hours[t.hour] && day_of_month[t.day] &&
                month[t.month] && day_of_week[t.week];
    }
}task[20];
unordered_map<string, int> nums;

void init()  //将月份及星期的英文表达与其值对应起来
{
    //注意 0-6分别为星期天到星期六
    string key[] = {
        "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec",
        "sun", "mon", "tue", "wed", "thu", "fri", "sat"
    };
    int value[] = {
        1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
        0, 1, 2, 3, 4, 5, 6
    };
    for (int i = 0; i < 19; i ++)
        nums[key[i]] = value[i];
}

int get(string str)  //将其字符串转换为它所表达的数值
{
    if (str[0] <= '9' && str[0] >= '0') return stoi(str);
    string s;
    for (auto c: str) s += tolower(c);
    return nums[s];
}

void work(string str, bool st[], int len)  //标记当前任务数组是否在范围内
{
    if (str == "*")
    {
        for (int i = 0; i < len; i ++) st[i] = true;
    }
    else
    {
       for (int i = 0; i < str.size(); i ++)
       {
            int j = i + 1;
            while (j < str.size() && str[j] != ',') j ++;
            string s = str.substr(i, j - i);
            i = j;
            int k = s.find('-');
            if (k != -1)
            {
                int l = get(s.substr(0, k)), r = get(s.substr(k + 1));
                for (int u = l; u <= r; u ++) st[u] = true;
            }
            else st[get(s)] = true;
       }
    }
}

int main()
{
    init();
    string st, ed;
    cin >> n >> st >> ed;
    
    for (int i = 0; i < n; i ++)
    {
        string minutes, hours, day_of_month, month, day_of_week, name;
        cin >> minutes >> hours >> day_of_month >> month >> day_of_week >> name;
        work(minutes, task[i].minutes, 60);
        work(hours, task[i].hours, 24);
        work(day_of_month, task[i].day_of_month, 32);
        work(month, task[i].month, 13);
        work(day_of_week, task[i].day_of_week, 7);
        task[i].name = name;
    }
    
    Timer t("197001010000"), S(st), E(ed);  //t为题目给出的日期,当前为星期四
    t.week = 4;
    while (t < E)
    {
        if (!(t < S))  //注意只重载了小于号 所以>=用!<表示
        {
            for (int i = 0; i < n; i ++)
                if (task[i].check(t))
                    cout << t.to_string() << " " << task[i].name << endl;
        }
        t.next();  //下一天
    }
    
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/166982.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为什么越来越多人选择学习Python?

今天我要和大家聊聊一个很热门的话题&#xff1a;为什么那么多人学习Python&#xff1f; 最近小编发现一个有趣的现象&#xff0c;高中生们居然在学校课程里学Python&#xff0c;这不仅给我们这些已经毕业多年的人当头一棒&#xff0c;更是彻底颠覆了传统观念。现在的高中生竟…

Embedding技术与应用(4): Embedding应用工程探析

编者按&#xff1a;随着互联网内容数量的急剧增长&#xff0c;个性化推荐已成为各大科技公司的核心竞争力之一。那么&#xff0c;如何构建一个可靠、高效的基于嵌入技术的推荐系统&#xff0c;使其能够在实际生产环境中正常运行呢&#xff1f;这是所有从业者都关心的问题。 本文…

(一)RISC-V 指令集及寄存器介绍

1. RISC-V指令集介绍 RISC-V 念作 “risk-five”&#xff0c;代表着 Berkeley 所研发的第五代精简指令集。 该项目 2010 年始于加州大学伯克利&#xff08;Berkeley&#xff09;分校&#xff0c;希望选择一款 ISA用于科研和教学。经过前期多年的研究和选型&#xff0c;最终决定…

UE TransformVector 学习笔记

假如算现在枪的位置&#xff0c;那么就是先拿人的位置再拿枪在本地的相对位置相加&#xff0c;就是枪的位置&#xff0c;也就是枪在场景中的位置&#xff0c;那么这里还可以写成Actor的变化和枪的相对位置连在TransformVector上&#xff0c;返回的就是枪的场景位置 这里做反算&…

统一身份认证平台之SSO建设

前言 上篇说道Passwordless无密码技术&#xff0c;也提到了数字时代密码管理的难度&#xff0c;其实在日常的生活中&#xff0c;很多用户也会因为忘记某些网站的登录密码而烦恼。为了方便记忆&#xff0c;很多人都在不同的站点使用相同的用户名和密码&#xff0c;虽然也可以减少…

PS太难学,这款软件更简单!——Lightroom

今天&#xff0c;我们来谈谈Adobe Photoshop Lightroom软件&#xff0c;它是当今数字拍摄工作流程中不可或缺的一部分。现在您可以快速导入、处理、管理和展示图像 — 从一张照片到所有照片。增强的校正工具、强大的组织功能以及灵活的打印选项可以帮助您加快速度。 Adobe Pho…

redis集群(Cluster)

文章目录 前言一、资源准备二、redis安装二、启动redis三、构建集群 前言 redis 集群三种方式&#xff1a;主从复制&#xff0c;哨兵模式&#xff0c;Cluster集群。 本文只介绍Cluster集群部署方案。 一、资源准备 服务器1台&#xff08;正常应该是3台,每台2个节点&#xff…

源启容器平台KubeGien 打造云原生转型的破浪之舰

云原生是应用上云的标准路径&#xff0c;也是未来发展大的趋势。如何将业务平滑过渡到云上&#xff1f;怎样应对上云期间的各项挑战呢&#xff1f;中电金信基于金融级数字底座“源启”打造了一款非常稳定可靠、多云异构、安全可控、开放灵活的容器平台产品——源启容器平台Kube…

Threejs_03 全屏+响应式画布实现

咋控制全屏呢&#xff1f; 1.做一个用来点击的按钮 var btn document.createElement("button"); btn.innerHTML "点击全屏"; btn.style.position "absolute"; btn.style.top "10px"; btn.style.left "10px"; btn.sty…

纯JS,RSA,AES,公钥,私钥生成及加解密

通过网络找的JS源文件&#xff0c;修改后使用&#xff0c;包含RSA 密匙对生成 及AES 加解密 涉及的JS源文件 下载 GitHub - cgrlancer/RSA-AES: 纯js,RSA,AES前端加解密 前端引用 import {generateRsaKeyWithPKCS8,encryptByRSA,decryptByRSA,encrypt,decrypt,testRsa} fr…

【Java程序员面试专栏 专业技能篇】Java SE核心面试指引(一):基础知识考察

关于Java SE部分的核心知识进行一网打尽,包括四部分:基础知识考察、面向对象思想、核心机制策略、Java新特性,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 本篇Blog为第一部分:基础知识考察,子节点表示追问或同级提问 基本概念 …

ICCV 2023|小红书 4 篇入选论文亮点解读,「开集视频目标分割」获得 Oral

近日&#xff0c;ICCV 正式揭晓 2023 年论文接收结果&#xff0c;小红书技术团队共有 4 篇论文入选&#xff0c;其中 1 篇为 Oral 论文&#xff08;Oral 接收率仅为 1.88%&#xff09;&#xff0c;最新科研成果涵盖了视频目标分割、3D 数字人重建、人体运动预测、视频分析等领域…

国产化区块链平台-FISCO BCOS 区块链

目录 FISCO BCOS 版本信息 系统概述 关键特性 组件服务 开发运维工具 FISCO BCOS作为一种企业级区块链平台&#xff0c;为企业和组织提供了高性能、隐私保护和可定制的区块链解决方案。其强大的架构和丰富的功能使得企业能够在安全可信的环境中开展区块链应用&#xff0…

Excel筛选怎么用?6种基本用法帮你提高效率!

“我在使用Excel进行数据处理时&#xff0c;需要对某些数据进行筛选&#xff0c;但是不知道应该如何使用筛选功能&#xff0c;有没有比较简单的使用方法呀&#xff1f;” Excel中的筛选功能是数据处理和分析中的重要工具&#xff0c;能够帮助用户快速找到所需的数据。但是有很多…

YOLOv8改进 | EIoU、SIoU、WIoU、DIoU、FocusIoU等二十余种损失函数

一、本文介绍 这篇文章介绍了YOLOv8的重大改进&#xff0c;特别是在损失函数方面的创新。它不仅包括了多种IoU损失函数的改进和变体&#xff0c;如SIoU、WIoU、GIoU、DIoU、EIOU、CIoU&#xff0c;还融合了“Focus”思想&#xff0c;创造了一系列新的损失函数。这些组合形式的…

Taro安装及使用

安装及使用 安装​ Taro 项目基于 node&#xff0c;请确保已具备较新的 node 环境&#xff08;>12.0.0&#xff09;&#xff0c;推荐使用 node 版本管理工具 nvm 来管理 node&#xff0c;这样不仅可以很方便地切换 node 版本&#xff0c;而且全局安装时候也不用加 sudo 了…

[解决] 问题:ImportError: cannot import name ‘Callable‘ from ‘collections‘

问题 我在运行yolov8的代码时&#xff0c;出现了ImportError: cannot import name Callable from collections的错误 原因 版本问题:以下collections的方法都在Python3.10版本后被取消了 ["Awaitable", "Coroutine", "AsyncIterable", "A…

(四)、基于 LangChain 实现大模型应用程序开发 | 基于知识库的个性化问答 (基本功能介绍)

⭐ 使用大语言模型构建一个能够回答关于给定文档和文档集合的问答系统是一种非常实用和有效的应用场景。与仅依赖模型预训练知识不同&#xff0c;这种方法可以进一步整合用户自有数据&#xff0c;实现更加个性化和专业的问答服务。 例如,我们可以收集某公司的内部文档、产品说明…

我理解的反射

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 我之前对反射的理解未必…