日期相关整理

news2024/9/22 15:40:38

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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重要功能丨支持1688API 接口对接一键跨境铺货及采购,解决跨境卖家货源烦恼!

在跨境电商运营中&#xff0c;不少卖家都会优先选择1688平台产品作为跨境店铺货源。 必不可少的1688商品详情接口 阿里巴巴中国站获得1688商品详情 API 返回值说明 item_get-获得1688商品详情 1688.item_get 公共参数 请求地址: 申请调用KEY测试 名称类型必须描述keyStrin…

鼠标点击网页任何地方都显示光标闪烁输入状态

出现这种情况的原因 因为大概是用户无意中打开了浏览器无障碍模式中的使用文本光标浏览网页的功能。 对于Chrome浏览器而言就是这样的&#xff1a; 直接按F7关闭这个模式

十倍增量的海外客户开发新方式来了!外贸企业可直接照做

外贸和B2大C型&#xff08;汽车、房产、保险、教育等&#xff09;企业出海过程中&#xff0c;除了常见的数字营销&#xff08;投放&#xff09;、平台营销、活动营销&#xff08;线下展会&#xff09;和内容营销&#xff0c;还有一个批量化可快速复制起量的营销方式&#xff1a…

SIMULIA-Simpack 2022x新功能介绍

通用功能 增加库伦摩擦类型 力元95 Coulomb Friction增加了3种新的摩擦方向类型用于模拟平面、圆柱和球面摩擦。 针对平移和旋转摩擦改进了滑动到粘着过渡阶段的检测&#xff0c;增加一个参数定义两种不同的滑移-粘滞过渡模式&#xff0c;即“Unloaded stick stiffness”和“…

超全毛玻璃图标教程,不看你就OUT了!

相比热衷于UI设计的朋友们&#xff0c;都曾经听说过玻璃拟态图标这个名词。玻璃拟态图标以其吸引人的外观和易于上手的特性&#xff0c;赢得了大家的青睐。在这篇文章中&#xff0c;将使用一款免费的在线图标设计工具Pixso&#xff0c;为你详解通过四个步骤&#xff0c;让你快速…

UE TransformVector 学习笔记

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

基于C++实现循环赛日程表(分治算法)

一、问题描叙 设有n2^k个运动员&#xff0c;要进行网球循环赛。现在要设计一个满足以下要求的比赛日程表 每个选手必须与其他n-1个选手各赛一场每个选手一天只能赛一次循环赛一共进行n-1天 二、问题分析 按此要求可将比赛日程表设计成n行n-1列的表&#xff0c;在表中第 i 行…

kafka本地安装报错

Error: VM option ‘UseG1GC’ is experimental and must be enabled via -XX:UnlockExperimentalVMOptions. #打开 bin/kafka-run-class.sh KAFKA_JVM_PERFORMANCE_OPTS“-server -XX:UseG1GC -XX:MaxGCPauseMillis20 -XX:InitiatingHeapOccupancyPercent35 -XX:ExplicitGCInv…

关于ASO优化的分步入门指南2

1、分析元数据。 分析我们收集的当前元数据和关键词&#xff0c;单独跟踪关键字词&#xff0c;然后跟踪组合。例如如果应用程序的标题是关于音乐的应用&#xff0c;则需要跟踪“音乐”、“听”、“听音乐”等关键词。填充元数据分析选项卡&#xff0c;使用搜索分数、下载影响和…

unexpected end of stream on

SpringCloud使用FeignClient调用第三方接口报错unexpected end of stream on ; 解决方法&#xff1a; 1.检查服务器端口是否被占用 lsof -i:端口&#xff1b; 2.nacos添加超时配置&#xff1a;

Taro安装及使用

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

vue3按需引入 vite-plugin-style-import 2.0版本报错(解决办法)

报错配置()&#xff1a;报错信息解决方法配置 报错配置()&#xff1a; //vite.config.js 部分代码 // 按需自动引入 elementplus 相关样式文件 import styleImport from vite-plugin-style-import// https://vitejs.dev/config/ export default defineConfig({plugins: [vue()…

uniapp开发小程序,包过大解决方案

1、首先和大家说一下 微信小程序 主包限制不能超过2M 分包一共不能超过8M 然后具体解决优化步骤如下&#xff0c; 将主包进行分包 在pages.json 下subPackages里面进行配置分包 分包配置完 配置过的文件都需要进行修改对应的路径 2 、 在运行的时候 一定要勾选 压缩代码 有…

Mac git查看分支以及切换分支

查看本地分支 git branch 查看远程仓库分支 git branch -r 查看本地与远程仓库分支 git branch -a 切换分支 git checkout origin/dev/js

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

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

c++多态(虚函数)机制

c多态发生的两个条件 c多态发生的两个条件&#xff08;牢记&#xff09;&#xff1a; 1、派生类继承含有虚函数的基类&#xff0c;并对基类的虚函数发生重写 2、通过 基类的指针或引用 调用派生类虚函数 多态过程详解 一个案例&#xff08;黑马&#xff09;-分析条件一&#x…

基于C#实现最长公共子序列

一、作用 最长公共子序列的问题常用于解决字符串的相似度&#xff0c;是一个非常实用的算法&#xff0c;作为码农&#xff0c;此算法是我们的必备基本功。 二、概念 举个例子&#xff0c;cnblogs 这个字符串中子序列有多少个呢&#xff1f;很显然有 27 个&#xff0c;比如其…

IDEA运行 支付宝案例

我 | 在这里 &#x1f575;️ 读书 | 长沙 ⭐软件工程 ⭐ 本科 &#x1f3e0; 工作 | 广州 ⭐ Java 全栈开发&#xff08;软件工程师&#xff09; &#x1f383; 爱好 | 研究技术、旅游、阅读、运动、喜欢流行歌曲 &#x1f3f7;️ 标签 | 男 自律狂人 目标明确 责任心强 ✈️公…

庖丁解牛:NIO核心概念与机制详解 01 _ 入门篇

文章目录 Pre输入/输出Why NIO流与块的比较通道和缓冲区概述什么是缓冲区&#xff1f;缓冲区类型什么是通道&#xff1f;通道类型 NIO 中的读和写概述Demo : 从文件中读取1. 从FileInputStream中获取Channel2. 创建ByteBuffer缓冲区3. 将数据从Channle读取到Buffer中 Demo : 写…