Crontab

来源:

标签:

参考资料:

相似题目:

题目

输入

输出

输入样例

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.排序操作:时间值小的先输出;时间值相等的,按输入顺序输出;时间值和名称都相等的,应只输出一个。3.包括开始时间,不包括结束时间。4.月份和星期几可以字母表示,忽略大小写。5.其它,请认真审题。

参考代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<algorithm>
#include<set>
using namespace std;
const char *month="janfebmaraprmayjunjulaugsepoctnovdec";
const char *weekday="sunmontuewedthufrisat";
int days[12]={31,28,31,30,31,30,31,31,30,31,30,31};struct Command{int no; //编号 long long time; //时间 char name[105]; //名称 bool operator < (const Command& rhs) const{if(time==rhs.time) return no<rhs.no;return time<rhs.time; }bool operator == (const Command& rhs) const{return strcmp(name,rhs.name)==0 && time==rhs.time; }
}command[10005];
int tot;//对执行命令计数int n; //输入命令个数
long long startTime,finishTime; //开始时间和结束时间
char input[6][105]; //每条命令含有6个参数,type依次是【Minutes】【Hours】【day of month】【month】【day of week】【name】
set<int> timeRange[5];//时间值范围集合,type依次是【Minutes】【Hours】【day of month】【month】【day of week】
set<int>::iterator M,H,dm,m;//对应上一行的前4个迭代器 void getTimeRange(int type, char *str);//对input[type]获取时间值范围
int addTimeRange(int type, int start, int finish);//对timeRange[type]增加时间值范围
void addCommand();//对获取到的时间值范围添加命令
//工具类函数
int getValue(int &i, char *str);//从str[i]起得到一个时间值
long long getToday(int y,int m,int d);//计算今天的日期
int getDayofWeek(int y,int m,int d);//计算今天是星期几 int main(){scanf("%d%lld%lld",&n,&startTime,&finishTime);for(int i=0;i<n;i++){for(int j=0;j<5;j++) timeRange[j].clear();for(int j=0;j<6;j++){//读入每条命令的6个参数,并对前5个参数处理 scanf("%s",input[j]);if(j!=5) getTimeRange(j,input[j]);}addCommand();}sort(command,command+tot);tot=unique(command,command+tot)-command;//忽略重复的 for(int i=0;i<tot;i++)  printf("%lld %s\n",command[i].time,command[i].name);return 0;
}void getTimeRange(int type, char *str){int start,finish;//处理星号表示的时间值范围 if(str[0]=='*'){if(type==0) start=0, finish=59;else if(type==1) start=0, finish=23;else if(type==2) start=1, finish=31;else if(type==3) start=1, finish=12;else if(type==4) start=0, finish=6;addTimeRange(type,start,finish);return;}//处理横杠和逗号表示的时间值范围 int i=0;int len=strlen(str);while(i<len){start=getValue(i,str);//获取一个值,如果后接'-',继续获取下一个值 if(str[i]=='-') finish=getValue(++i,str);else finish=start;addTimeRange(type,start,finish);}
}void addCommand(){long long today,time;int dayofWeek;int y1=startTime/1e8, y2=finishTime/1e8;int startDay=startTime/1e4;for(int y=y1;y<=y2;y++)//yearfor(m=timeRange[3].begin();m!=timeRange[3].end();m++)//month for(dm=timeRange[2].begin();dm!=timeRange[2].end();dm++){//day of monthtoday=getToday(y,*m,*dm);//得到今天的日期if(today>=startDay && timeRange[4].count(getDayofWeek(y,*m,*dm))){//今天是星期几,是否在day of week中 for(H=timeRange[1].begin();H!=timeRange[1].end();H++)//Hoursfor(M=timeRange[0].begin();M!=timeRange[0].end();M++){//Minutes time=today*1e4+(*H)*1e2+(*M);if(time>=startTime && time<finishTime){strcpy(command[tot].name,input[5]);command[tot].time=time;command[tot].no=tot;tot++;}else if(time>=finishTime) return;}}}
}int getValue(int &i, char *str){char value[105];int cnt=0;int len=strlen(str);while(i<len){//如果是数值 if(isdigit(str[i])){while(i<len && isdigit(str[i])){value[cnt++]=str[i++];}value[cnt]='\0';return atoi(value); }//如果是字母 else if(isalpha(str[i])){while(i<len && isalpha(str[i])){value[cnt++]=tolower(str[i++]);}value[cnt]='\0';char *p=strstr(month,value);if(p) return (p-month)/3+1;else if(p=strstr(weekday,value)) return (p-weekday)/3;}else i++;}return -1;
}int addTimeRange(int type,int start,int finish){for(int i=start;i<=finish;i++){timeRange[type].insert(i);}
}long long getToday(int y,int m,int d){if(y%4==0 && y%100!=0 || y%400==0) days[1]=29;else days[1]=28;if(d>days[m-1]) return -1;return y*1e4+m*1e2+d;
}int getDayofWeek(int y,int m,int d){if(m==1||m==2){m+=12;y--;}return (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400+1)%7;
} 

CCF计算机软件能力认证试题练习:201712-3 Crontab相关推荐

  1. CCF计算机软件能力认证试题练习:201903-1 小中大

    小中大 来源:CCF 标签: 参考资料: 相似题目: 背景 在数据分析中,最小值最大值以及中位数是常用的统计信息. 题目 老师给了你 n 个整数组成的测量数据,保证有序(可能为升序或降序),可能存在重 ...

  2. CCF计算机软件能力认证试题练习:201803-2 碰撞的小球

    碰撞的小球 来源:CCF 标签: 参考资料: 相似题目: 题目 数轴上有一条长度为L(L为偶数)的线段,左端点在原点,右端点在坐标L处.有n个不计体积的小球在线段上,开始时所有的小球都处在偶数坐标上, ...

  3. CCF计算机软件能力认证试题练习:201809-2 买菜

    买菜 来源:CCF 标签: 参考资料: 相似题目: 题目 小H和小W来到了一条街上,两人分开买菜,他们买菜的过程可以描述为,去店里买一些菜然后去旁边的一个广场把菜装上车,两人都要买n种菜,所以也都要装 ...

  4. CCF计算机软件能力认证试题练习:201909-2 小明种苹果(续)

    小明种苹果(续) 来源:CCF 标签: 参考资料: 相似题目: 题目 小明在他的果园里种了一些苹果树,这些苹果树排列成一个圆.为了保证苹果的品质,在种植过程中要进行疏果操作.为了更及时地完成疏果操作, ...

  5. CCF计算机软件能力认证试题练习:201609-3 炉石传说

    炉石传说 来源:CCF 标签: 参考资料: 相似题目: 题目 <炉石传说:魔兽英雄传>(Hearthstone: Heroes of Warcraft,简称炉石传说)是暴雪娱乐开发的一款集 ...

  6. CCF计算机软件能力认证试题练习:201803-4 棋局评估

    棋局评估 来源:CCF 标签: 参考资料: 相似题目: 题目 Alice和Bob正在玩井字棋游戏. 井字棋游戏的规则很简单:两人轮流往3*3的棋盘中放棋子,Alice放的是"X", ...

  7. CCF计算机软件能力认证试题练习:201912-3 化学方程式

    化学方程式 来源:CCF 标签: 参考资料: 相似题目: 题目 化学方程式,也称为化学反应方程式,是用化学式表示化学反应的式子.给出一组化学方程式,请你编写程序判断每个方程式是否配平(也就是方程式中等 ...

  8. CCF计算机软件能力认证试题练习:201612-2 工资计算

    工资计算 来源: 标签: 参考资料: 相似题目: 题目 小明的公司每个月给小明发工资,而小明拿到的工资为交完个人所得税之后的工资.假设他一个月的税前工资(扣除五险一金后.未扣税前的工资)为S元,则他应 ...

  9. CCF计算机软件能力认证试题练习:201512-2 消除类游戏

    消除类游戏 来源: 标签: 参考资料: 相似题目: 题目 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有 ...

最新文章

  1. java案例——字符串反转
  2. 中值定理符号怎么读_微分、微分中值定理、泰勒公式
  3. bzoj 3100 排列
  4. android studio编译提示错误:android Error:(21, 19) 错误: 程序包R不存在
  5. 简单的html渲染模板引擎
  6. 记一次 Python Web 接口优化,性能提升25倍!
  7. 关于动画的几种状态表示的含义以及能够使用2d动画表述为什么要使用3d动画表述
  8. Sqlserver内存管理:限制最大占用内存(转载)
  9. AAAI 2020 | 腾讯优图10篇论文入选,含速算识别、视频识别等主题
  10. MySQL表/视图/存储过程and函数/触发器/事件与数据库之间的关系
  11. redis 内存管理分析
  12. C#创建自定义配置节点
  13. Pygame实战:这款“欢乐打地鼠”小游戏让几亿人“上瘾“?不玩绝对是你的损失。
  14. spss度量 名义 有序
  15. GBK-unicode对照
  16. Mac OS X系统恢复软件
  17. TwinCAT3网卡驱动无法安装解决办法
  18. Python-静态网页示例-豆瓣电影Top250
  19. 移动硬盘分区格式变为RAW的解决办法
  20. 【移动开发作业5】近场通信的分析

热门文章

  1. 在cmd下用cd命令进不了D盘的问题,亲测可用
  2. Ubuntu系统突然进不去了
  3. 在顺序表中第五个位置插入一个元素9,实现顺序表插入的基本操作,输出顺序表中所有元素
  4. 怎样查看所有计算机网络,如何查看局域网内全部在线的电脑
  5. 3D跑酷教程 —— 相机的使用
  6. Fedora 28 CCProxy链接网络方法
  7. 字符集编码(三):Unicode
  8. MySQL 两张表取差集
  9. 智能网联汽车——车联网
  10. 『NLP学习笔记』工业级自然语言处理spaCy开源库的使用