CCF 2017-12-3 Crontab 100分

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

CCF 2017-12-3 Crontab 100分_第1张图片

CCF 2017-12-3 Crontab 100分_第2张图片

CCF 2017-12-3 Crontab 100分_第3张图片

CCF 2017-12-3 Crontab 100分_第4张图片

样例输入

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

 

 

#include
#include
#include
using namespace std;
//按时间从头到尾走会比较耗时间,容易超时
//所以采用分析每个crontab中的时间,判断是否在时间区间内部 
typedef struct Node{
	long long time;
	string work;
}Node;

bool operator<(const Node a,const Node b){//重写<  把结点装入set中 
	return a.time time;

int getWeek(int year,int mon,int day){//根据年月日获得星期几 
	int month_day[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
	if((year%4==0 && year%100!=0) || year%400==0)month_day[2]=29;
	int sum=0;
	for(int i=1970;i &stl){//分析输入的字符串 
	vector str;
	for(int i=0;i='A' && s[i]<='Z')s[i]+=32;
	}
	for(int i=0;i2){//若长度大于2,则一定包含'-' 
			j=0;
			while(temp[j]!='-')j++;//先找到'-'坐标 
			int b=getNum(temp.substr(0,j));//记录'-'前一个数字 
			int e=getNum(temp.substr(j+1,temp.size()));//记录'-'后一个数字 
			for(int k=b;k<=e;k++){//从头到尾,把所有的数字,装入结果 
				stl.push_back(k);
			}
		}else{//否则只是一个数字 
			stl.push_back(getNum(temp));
		}
	}
}

int main(){
	int n;
	string s,matter;
	long long begin,end;
	cin>>n>>begin>>end;
	int begin_year=begin/100000000,end_year=end/100000000;//记录开始的年份和结束的年份 
	while(n--){
		vector minu,hour,day,month,week;//记录每个类型的数据能接受的范围 
		cin>>s;  
		if(s=="*"){//输入分钟 
			for(int i=0;i<60;i++){
				minu.push_back(i);
			}
		}else deal(s,minu);
		cin>>s;
		if(s=="*"){//输入小时
			for(int i=0;i<24;i++){
				hour.push_back(i);
			}
		}else deal(s,hour);
		cin>>s;
		if(s=="*"){//输入日期
			for(int i=1;i<32;i++){
				day.push_back(i);
			}
		}else deal(s,day);
		cin>>s;   
		if(s=="*"){//输入月份 
			for(int i=1;i<13;i++){
				month.push_back(i);
			}
		}else deal(s,month);
		cin>>s;
		if(s=="*"){//输入星期
			for(int i=0;i<7;i++){
				week.push_back(i);
			}
		}else deal(s,week);
		cin>>matter;
		
		for(int i=begin_year;i<=end_year;i++){//遍历crontab包含的每个日期 
			for(int j=0;j::iterator it=time.begin();it!=time.end();it++){
		Node temp=(*it);
		if(temp.time>=begin && temp.time

更多相关CCF的试题解答,请点击>>CCF历年认证考试解答

你可能感兴趣的:(CCF 2017-12-3 Crontab 100分)