CSP 201712-3 Crontab(100)

样例输入
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

思路:很复杂的模拟,这里是先把带有’-‘和’,'的指令拆分成只有数字和*的指令,然后再将每一分钟遍历,查看是否满足规则,存到数组中,最后排序输出。
此题还要注意优化,为此当年、月、日等明显不满足要求的时候应及时遍历下一个,否则会超时。
坑点:
1.闰年、星期的确定。(星期确定错了卡了好久。)
2.指令有可能带有重复天数,应进行去重。

满分C++代码如下:

#include<iostream>
#include<map>
#include<vector>
#include<set>
#include<string.h>
#include<algorithm>
using namespace std;
int n,wdToDate[140][13][32],mtod[] = {0,31,28,31,30,31,30,31,31,30,31,30,31},nowid = 0;//1~12月天数
map<string,int> mp;
bool border[5][2];
string from,to;//12位
inline bool longYear(int x){return (x%4==0&&x%100!=0)||(x%400==0);
}
struct OutCmd{string time,thing;int id;OutCmd(string time,string thing,int id){this->time = time;this->thing = thing;this->id = id;}
};
struct Cmd{string minutes,hours,day,month,weekday,thing;Cmd(){}Cmd(string a,string b,string c,string d,string e,string f){month = a;day = b;hours = c;weekday = d;minutes = e;thing = f;}
}cmd;
struct _Date{int year,month,day,hour,minute;
}dfrom,dto;
vector<OutCmd> _ans;
bool cmp(OutCmd a,OutCmd b){if(a.time!=b.time)return a.time<b.time;return a.id<b.id;
}
_Date stringToDate(string x){_Date _date;_date.year = stoi(x.substr(0,4));_date.month = stoi(x.substr(4,2));_date.day = stoi(x.substr(6,2));_date.hour = stoi(x.substr(8,2));_date.minute = stoi(x.substr(10));return _date;
}int _stoi(string x){bool isNumber = true;int len = x.length();for(int i = 0;i<len;i++){if(!(x[i]>='0'&&x[i]<='9'))isNumber = false;if((x[i]>='A'&&x[i]<='Z'))//大写转小写 x[i]=tolower(x[i]);}if(isNumber)return stoi(x);else if(x=="*")return -1;//全部 else if((x[0]>='a'&&x[0]<='z'))//根据字符串读取映射表 return mp[x];
}void calWdDate(){int t = 3;for(int i = 0;i<=139;i++){mtod[2]=longYear(i+1970)?29:28;//计算二月天数 for(int j = 1;j<=12;j++){for(int k = 1;k<=mtod[j];k++){wdToDate[i][j][k] = t = (t+1)%7;//i = 年-1970,j = 月,k=日。 }}}} string toString(int x){//把数字转化成带前导0的形式 if(x<10)return "0"+to_string(x);elsereturn to_string(x);
}void init_map(){string mpArr[]={"","jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec","sun","mon","tue","wed","thu","fri","sat"};for(int i = 0;i<20;i++)mp[mpArr[i]] = i%13;
}vector<string> solveSymbol(string x){vector<string> ans;string t = "";bool f = false;x+=',';//避免讨论尾部 int len = x.length();for(int i = 0;i<len;i++){if(x[i]=='-'||x[i]==','){            if(f){//由短线连接 int fi = _stoi(ans.back());ans.pop_back();for(int j = fi;j<=_stoi(t);j++)ans.push_back(to_string(j));}elseans.push_back(t);t = ""; if(x[i]=='-')f = true;else if(x[i]==',')f = false;}elset += x[i];}set<string> s;for(int i = 0;i<ans.size();i++){s.insert(ans[i]);}ans.clear();for(set<string>::iterator it = s.begin();it!=s.end();it++)ans.push_back(*it);return ans;
}
void storeCmd(Cmd _cmd){//处理单条指令 memset(border,0,sizeof(border));int minu = _stoi(_cmd.minutes);int hour = _stoi(_cmd.hours);int day = _stoi(_cmd.day);int mont = _stoi(_cmd.month);int weed = _stoi(_cmd.weekday);for(int i = dfrom.year;i<=dto.year;i++){//年 mtod[2]=longYear(i)?29:28;//计算二月天数 border[0][0] = dfrom.year==i;//记录当前是否处于左边界或右边界 border[0][1] = dto.year==i;for(int j = border[0][0]?dfrom.month:1;j<=(border[0][1]?dto.month:12);j++){//月 if(j!=mont&&mont!=-1)    continue;//优化 border[1][0] = border[0][0]&&dfrom.month == j;border[1][1] = border[0][1]&&dto.month==j;for(int k = border[1][0]?dfrom.day:1;k<=(border[1][1]?dto.day:mtod[j]);k++){//日if(k!=day&&day!=-1) continue;//优化border[2][0] = border[1][0]&&dfrom.day == k;border[2][1] = border[1][1]&&dto.day==k;for(int l = border[2][0]?dfrom.hour:0;l<=(border[2][1]?dto.hour:23);l++){//小时if(l!=hour&&hour!=-1)  continue;//优化border[3][0] = border[2][0]&&dfrom.hour == l;border[3][1] = border[2][1]&&dto.hour==l;for(int m = border[3][0]?dfrom.minute:0;m<=(border[3][1]?dto.minute:59);m++){//分钟if((wdToDate[i-1970][j][k]==weed||weed==-1)&&(minu==m||minu==-1)){_ans.push_back(OutCmd(toString(i)+toString(j)+toString(k)+toString(l)+toString(m),_cmd.thing,nowid));                            } } }}}}
}void splitCmd(Cmd _cmd){//对于有短线或者逗号的分割成普通的指令进行处理 vector<string> tvec[6];tvec[0] = solveSymbol(_cmd.month);tvec[1] = solveSymbol(_cmd.day);tvec[2] = solveSymbol(_cmd.hours);tvec[3] = solveSymbol(_cmd.weekday);tvec[4] = solveSymbol(_cmd.minutes);for(int i = 0;i<tvec[0].size();i++)for(int j = 0;j<tvec[1].size();j++)for(int k = 0;k<tvec[2].size();k++)for(int l = 0;l<tvec[3].size();l++)for(int m = 0;m<tvec[4].size();m++)storeCmd(Cmd(tvec[0][i],tvec[1][j],tvec[2][k],tvec[3][l],tvec[4][m],_cmd.thing));
}int main(){ios::sync_with_stdio(false);cin>>n>>from>>to;dfrom = stringToDate(from);dto = stringToDate(to);calWdDate(); //计算周几和日期的关系 init_map();        //建立单词日期映射表 for(int i = 0;i<n;i++){cin>>cmd.minutes>>cmd.hours>>cmd.day>>cmd.month>>cmd.weekday>>cmd.thing;splitCmd(cmd);//分割并计算cmd nowid++;//记录输入顺序 }sort(_ans.begin(),_ans.end(),cmp);//将时间按字母序排序,若相同则排序id for(int i = 0;i<_ans.size();i++)if(_ans[i].time!=to)//右侧为开区间 cout<<_ans[i].time<<" "<<_ans[i].thing<<endl;return 0;
}

代码中“优化”加上前后的得分对比图(限时10秒)。

CSP 201712-3 Crontab(100)相关推荐

  1. CSP 201712-4 行车路线(100)

    CSP 201712-4 行车路线(100) 问题描述 小明和小芳出去乡村玩,小明负责开车,小芳来导航. 小芳将可能的道路分为大道和小道.大道比较好走,每走1公里小明会增加1的疲劳度.小道不好走,如果 ...

  2. CCF201712-3 Crontab(100分)【模拟+文本处理】

    样例输入 3 201711170032 201711222352 0 7 * * 1,3-5 get_up 30 23 * * Sat,Sun go_to_bed 15 12,18 * * * hav ...

  3. (100)Vivado TCL命令概述

    (100)Vivado TCL命令概述 1 文章目录 1)文章目录 2)时序约束引言 3)FPGA时序约束课程介绍 4)Vivado TCL命令概述 5)技术交流 6)参考资料 2 时序约束引言 1) ...

  4. (100)FPGA单沿和双沿采样(下降沿采样)

    (100)FPGA单沿和双沿采样(下降沿采样) 1 文章目录 1)文章目录 2)FPGA入门与提升课程介绍 3)FPGA简介 4)FPGA单沿和双沿采样(下降沿采样) 5)技术交流 6)参考资料 2 ...

  5. (100)详细描述一个你做过的项目, 面试必问(二十四)(第20天)

    (100)详细描述一个你做过的项目, 面试必问(二十四)(第20天) 1 文章目录 1)文章目录 2)FPGA初级课程介绍 3)FPGA初级课程架构 4)详细描述一个你做过的项目, 面试必问(二十四) ...

  6. (100)FPGA RAM实现(V实现)

    (100)FPGA RAM实现(V实现) 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)FPGA RAM实现(V实现) 5)结语 1.2 FPGA简介 FPGA(Fie ...

  7. (100)Verilog HDL:UART波特率设计

    (100)Verilog HDL:UART波特率设计 1.1 目录 1)目录 2)FPGA简介 3)Verilog HDL简介 4)Verilog HDL:UART波特率设计 5)结语 1.2 FPG ...

  8. 信奥赛一轮CSP初赛知识清单(一)

    这个清单主要针对一些要参加CSP认证的人.这个认证涉及的知识面是非常大的,可以说是只要跟计算机有关的东西,这里都有.我去年也参加过CSP-J初级组的认证,那个题里的代码有时候会有100多行,所以要水平 ...

  9. linux shell 之 crontab(定时任务)详解

    1.定义: crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令.该命令从标准输入设备读取指令,并将其存放于"crontab"文件中,以供之后读取 ...

  10. LeetCode刷题(100)~唯一摩尔斯密码词

    题目描述 国际摩尔斯密码定义一种标准编码方式,将每个字母对应于一个由一系列点和短线组成的字符串, 比如: "a" 对应 ".-", "b" ...

最新文章

  1. JavaEE Servlet 并发问题
  2. LeetCode MySQL 550. 游戏玩法分析 IV
  3. 空格 过滤多个_CAD选择过滤器的运算符如何使用?
  4. 当create table as select 遇上大数据
  5. HTTP Error 415: Unsupported Media Type! 这个错误
  6. 95-080-040-源码-启动-start-cluster.sh
  7. 早上起床后喝的第一杯水最好选择白开水
  8. LUOGU P4281 [AHOI2008]紧急集合 / 聚会 (lca)
  9. Vue报错: Maximum call stack size exceeded
  10. 威盾VIACONTROL远程监控注册机及试用手记
  11. 取经队伍要裁员,第一个就是唐僧
  12. Python编程输出所有的“水仙花数”
  13. 2010年中考英语写作高分指导
  14. 图基(Tukey)检验
  15. 《高等代数学》(姚慕生),例1.5.10
  16. Python爬虫入门教程: 半次元COS图爬取
  17. 名帖367 邓文原 章草《临皇象急就章》
  18. Java面向对象系列[v1.0.0][类加载器]
  19. “在我心里,一直有一个户口本,上面有我们的名字”
  20. 玩cf出现outofmemory_玩CF自动掉线出现out of memory怎么处理?

热门文章

  1. 计算机系统与手机系统,电脑经常重装系统与手机常刷机好吗?二者有哪些区别?别弄错了!...
  2. python header函数_Header函数
  3. 某Java大佬在地表最强Java企业(阿里)面试总结
  4. 初学者如何快速练习盲打
  5. 结巴分词5--关键词抽取
  6. 解决windows2003 sp1“数据执行保护”惹的祸
  7. matlab中position用法_Matlab中的zeta函数用法
  8. matlab中zeta函数,黎曼zeta函数是什么,具体点
  9. php在线图片签名,ElementUi+Vue+Php+fpdf+fpdi 实现文档在线签订(图片水印、手写签名)...
  10. PowerDesigner显示Comment注释