博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CSP]2017-12-3 Crontab
阅读量:4217 次
发布时间:2019-05-26

本文共 3256 字,大约阅读时间需要 10 分钟。

问题描述

试题编号: 201712-3
试题名称: Crontab
时间限制: 10.0s
内存限制: 256.0MB
问题描述:

 

好复杂的题目啊。。。。

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;typedef long long LL;int firstYear, lastYear; // 开始与结束的年份int range[5] = { 60, 24, 31, 12, 7 };int days[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };string week[] = { "sun", "mon", "tue", "wed", "thu", "fri", "sat" },mon[] = { "jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec" };map
mp; // 保存各个英文缩写对应的值vector
> ans;int strToI(string &str){ if(isalpha(str[0])) return mp[str]; else{ int num = 0; for(int i = 0; i < str.size(); ++i){ num = num*10 + str[i]-'0'; } return num; }}void dealMinus(set
&tmp,string &str){ for(int i = 0; i < str.size(); ++i) str[i] = tolower(str[i]); size_t p = str.find('-'); if(string::npos != p){ string left = str.substr(0,p); string right = str.substr(p+1); int l = strToI(left); int r = strToI(right); for(int i = l; i <= r; ++i){ tmp.insert(i); } } else{ tmp.insert(strToI(str)); }}void findValue(set
&tmp,string &s,int j){ if(s == "*"){ for(int i = 0; i < range[j]; ++i){ if(j == 2 || j == 3) tmp.insert(i+1); else tmp.insert(i); } return ; } s += ','; size_t pos = 0,next = s.find(','); string str; while(string::npos != next){ str = s.substr(pos,next-pos); dealMinus(tmp,str); pos = next+1; next = s.find(',',pos); }}int getDay(int year, int month, int day){// 先改为默认值 days[2] = 28; //下面必须在 day > days[month] 之前 因为 可能刚好 day = 29 满足条件 由于未能及时更新 引起错误 if(year%4 == 0){ days[2] = 29; } if(day > days[month]) return -1; int sum = 4; int q = year-1970; sum += q/4*5 + q%4; if(q%4 == 3) ++sum; for(int i = 1; i < month; ++i){ sum += days[i]; } sum += day-1; return sum % 7;}void fillVector(vector
>&v,vector
&tmp, int j, LL mul){ if(j == 0){ v[j] = tmp; } else{ vector
&pre = v[j-1]; if(j != 4){ for(int k = 0; k < tmp.size(); ++k){ for(int l = 0; l < pre.size(); ++l){ v[j].push_back(mul*tmp[k] + pre[l]); } } } else{ int judge[7] = {0}; for(int i = 0; i < tmp.size(); ++i){ judge[tmp[i]] = 1; } for(int l = 0; l < pre.size(); ++l){ int month = pre[l]/1000000; int day = pre[l]/10000%100; for(int year = firstYear; year <= lastYear; ++year){ int dow = getDay(year,month,day); if(dow != -1 && judge[dow]){ v[4].push_back(year*mul+pre[l]); } } } } }}int main() { for(int i = 0; i < 12; ++i){ mp[mon[i]] = i+1; } for(int i = 0; i < 7; ++i){ mp[week[i]] = i; } LL n,begin,end; cin >> n >> begin >> end; firstYear = begin / 100000000, lastYear = end / 100000000; vector
> cron(n,vector
(6)); for(int i = 0; i < n; ++i){ for(int j = 0; j < 6; ++j){ cin >> cron[i][j]; } } for(int i = 0; i < n; ++i){ vector
> v(5); LL mul = 1; for(int j = 0; j < 5; ++j){ set
valid; findValue(valid,cron[i][j],j); vector
tmp; for(set
::iterator it = valid.begin(); it != valid.end(); ++it){ tmp.push_back(*it); } fillVector(v,tmp,j,mul); mul *= 100; } for(int k = 0; k < v[4].size(); ++k){ ans.push_back(make_pair(v[4][k],i)); } } sort(ans.begin(),ans.end()); for(vector
>::iterator it = ans.begin(); it != ans.end(); ++it){ if(it->first >= begin && it->first < end){ cout << it->first << " "<< cron[it->second][5] << endl; } } return 0; }

参考:

转载地址:http://zwsmi.baihongyu.com/

你可能感兴趣的文章
数据仓库分层
查看>>
常见数据结构-TrieTree/线段树/TreeSet
查看>>
Hive数据倾斜
查看>>
TopK问题
查看>>
HQL排查数据倾斜
查看>>
DAG以及任务调度
查看>>
LeetCode——DFS
查看>>
MapReduce Task数目划分
查看>>
ZooKeeper分布式锁
查看>>
3126 Prime Path
查看>>
app自动化测试---ADBInterface驱动安装失败问题:
查看>>
RobotFramework+Eclipse安装步骤
查看>>
测试的分类
查看>>
photoshop cc2019快捷键
查看>>
pycharm2019版本去掉下划线的方法
查看>>
九度OJ 1091:棋盘游戏 (DP、BFS、DFS、剪枝)
查看>>
leetcode 13: Roman to Integer
查看>>
a标签中调用js方法
查看>>
js函数中传入的event参数
查看>>
[hive]优化策略
查看>>