zoukankan      html  css  js  c++  java
  • ccf-20171203 Crontab问题

    这题有如下几个点要注意:

    1.最开始输出的开始时间和截止时间,这里是不包含截止时间的。

    2.月份和星期的英文表示是大小写任意的,并未规定必须是Sat这种形式。

    3.星期天的数字标识是0。

    我的思路是,首先将月份、天数、小时、分钟、星期统统规格化,格式如下:

    月份:规格化前:1,2-4

       规格化后:1 2 3 4

    再使用stringstream类来依次遍历规格化的字符串。在遍历月份的过程中,要考察天数与月份是否匹配,同时判定是否满足星期的要求。

    最后判定结果是否在小于截止时间,并且大于等于起始时间。

    题目和代码如下:

    #include <bits/stdc++.h>
    /*#include<stdio.h>
    #include<iostream>
    #include<cstring>
    #include<stdlib.h>
    #include<sstream>
    #include<map>
    #include<vector>*/
    using namespace std;
    class Time{
    	public:
    		int year,month,day,hour,minute;
    		Time(int year_,int month_,int day_,int hour_,int minute_):year(year_),month(month_),day(day_),hour(hour_),minute(minute_){
    		}	
    		void ShowTime(){
    			cout<<year<<","<<month<<","<<day<<","<<hour<<","<<minute<<endl;
    		}
    };
    class Event{
    	public:
    		string min,hou,dayofmonth,mon,dayofweek,command;
    		Event(string min_,string hou_,string dayofmonth_,string mon_,string dayofweek_,string command_):min(min_),hou(hou_),dayofmonth(dayofmonth_),mon(mon_),dayofweek(dayofweek_),command(command_){
    		}
    		void ShowEvent(){
    			cout<<min<<","<<hou<<","<<dayofmonth<<","<<mon<<","<<dayofweek<<","<<command<<endl;
    		}
    };
    string Int_to_String(int n)
    {
    	ostringstream stream;
    	stream<<n;  //n为int类型
    	return stream.str();
    }
    string Operator_special(string temps){
    	string tts="";
    	stringstream ss(temps);
    	string temp="";
    	while(getline(ss,temp,',')){
    	if(temp.find("-")!=string::npos){
    		stringstream ss1(temp);
    		string temp_i="";
    		string temp_j="";
    		getline(ss1,temp_i,'-');
    		getline(ss1,temp_j,'-');
    		for(int i=atoi(temp_i.c_str());i<=atoi(temp_j.c_str());i++){
    			tts+=Int_to_String(i);
    			tts+=" ";
    		}
    	}else{
    			tts+=temp;
    			tts+=" ";
    		}
    	}
    	return tts;
    }
    
    void toStandard(string &str)//转化为标准小写 
    {
        int len=str.size();
        for(int i=0;i<len;++i)str[i]=tolower(str[i]);
    }
    int  main(){
    	map<string,vector<string> > mmps;
    	int n;
    	string s,t;
    	cin>>n>>s>>t;
    	Time * Total[2];
    	Total[0]=new Time(atoi(s.substr(0,4).c_str()),atoi(s.substr(4,2).c_str()),atoi(s.substr(6,2).c_str()),atoi(s.substr(8,2).c_str()),atoi(s.substr(10,2).c_str()));
    	Total[1]=new Time(atoi(t.substr(0,4).c_str()),atoi(t.substr(4,2).c_str()),atoi(t.substr(6,2).c_str()),atoi(t.substr(8,2).c_str()),atoi(t.substr(10,2).c_str()));
    	Event * event[n];
    	for(int i1=0;i1<n;i1++){
    		string temp_min,temp_hou,temp_dayofmonth,temp_mon,temp_dayofweek,command;
    		cin>>temp_min>>temp_hou>>temp_dayofmonth>>temp_mon>>temp_dayofweek>>command;
    		//event[i]=new Event(temp_min,temp_hou,temp_dayofmonth,temp_mon,temp_dayofweek,command);
    		string result="";
    		toStandard(temp_mon);//不区别大小写,转化为标准小写
    		map<string,int> months;
    		months["jan"]=1,months["feb"]=2,months["mar"]=3,months["apr"]=4,months["may"]=5,months["jun"]=6,months["jul"]=7,months["aug"]=8,months["sep"]=9,months["oct"]=10,months["nov"]=11,months["dec"]=12;
    		map<string,int>::iterator it;
    		for(it=months.begin();it!=months.end();it++){
    			if(temp_mon.find(it->first)!=string::npos){
    			temp_mon.replace(temp_mon.find(it->first),3,Int_to_String(it->second));
    			}
    		}
    		if(temp_mon=="*"){
    			temp_mon="";
    			for(int ii=1;ii<=12;ii++){
    				temp_mon+=Int_to_String(ii);
    				temp_mon+=" ";
    			}
    			//cout<<temp_mon<<endl;
    		}else if(temp_mon.find(",")!=string::npos||temp_mon.find("-")!=string::npos){
    			string tts=Operator_special(temp_mon);
    			temp_mon=tts;
    		}
    		if(temp_dayofmonth=="*"){
    			temp_dayofmonth="";
    			for(int ii=1;ii<=31;ii++){
    				temp_dayofmonth+=Int_to_String(ii);
    				temp_dayofmonth+=" ";
    			}
    			//cout<<temp_dayofmonth<<endl;
    		}else if(temp_dayofmonth.find(",")!=string::npos||temp_dayofmonth.find("-")!=string::npos){
    			string tts=Operator_special(temp_dayofmonth);
    			temp_dayofmonth=tts;
    		}
    		toStandard(temp_dayofweek);//不区别大小写,转化为标准小写 
    		map<string,int> weeks;
    		weeks["sun"]=0,weeks["mon"]=1,weeks["tue"]=2,weeks["wed"]=3,weeks["thu"]=4,weeks["fri"]=5,weeks["sat"]=6;
    		//map<string,int>::iterator it;
    		for(it=weeks.begin();it!=weeks.end();it++){
    			if(temp_dayofweek.find(it->first)!=string::npos){
    			temp_dayofweek.replace(temp_dayofweek.find(it->first),3,Int_to_String(it->second));
    			}
    		}
    		if(temp_dayofweek.find(",")!=string::npos||temp_dayofweek.find("-")!=string::npos){
    			string tts=Operator_special(temp_dayofweek);
    			temp_dayofweek=tts;
    		}
    		if(temp_hou=="*"){
    			temp_hou="";
    			for(int ii=0;ii<=23;ii++){
    				temp_hou+=Int_to_String(ii);
    				temp_hou+=" ";
    			}
    			//cout<<temp_hou<<endl;
    		}else if(temp_hou.find(",")!=string::npos||temp_hou.find("-")!=string::npos){
    			string tts=Operator_special(temp_hou);
    			temp_hou=tts;
    		}
    		if(temp_min=="*"){
    			temp_min="";
    			for(int ii=0;ii<=59;ii++){
    				temp_min+=Int_to_String(ii);
    				temp_min+=" ";
    			}
    		}else if(temp_min.find(",")!=string::npos||temp_min.find("-")!=string::npos){
    			string tts=Operator_special(temp_min);
    			temp_min=tts;
    		}
    		string temps1="",temps2="",temps3="",temps4="";
    		for(int i=Total[0]->year;i<=Total[1]->year;i++){
    			int total_day0=0;
    			for(int ii=1970;ii<i;ii++)//Total会在外层再包含一个循环 
    			{
    				if(ii%400==0||(ii%4==0&&ii%100!=0)){
    						total_day0+=366;
    				}else{
    						total_day0+=365;
    				}
    			}
    			istringstream inputString1(temp_mon);
    			while(inputString1>>temps1){
    				istringstream inputString2(temp_dayofmonth);
    				while(inputString2>>temps2){
    					int day_li=0;
    					if(atoi(temps1.c_str())==2){
    						if(i%400==0||(i%4==0&&i%100!=0)){
    							day_li=29;
    						}else{
    							day_li=28;
    						}
    					}else if((atoi(temps1.c_str())==1)||(atoi(temps1.c_str())==3)||(atoi(temps1.c_str())==5)||(atoi(temps1.c_str())==7)||(atoi(temps1.c_str())==8)||(atoi(temps1.c_str())==10)||(atoi(temps1.c_str())==12)){
    						day_li=31;
    					}else{
    						day_li=30;
    					}
    				/*	if(atoi(temps2.c_str())==31){
    						cout<<"here"<<endl;
    						cout<<day_li<<endl;
    					}*/
    					if(atoi(temps2.c_str())>day_li){
    						continue;
    					}
    					int total_day=total_day0;
    					if(temp_dayofweek!="*"){
    						int ii=atoi(temps1.c_str());
    						int num2=28;
    						if(i%400==0||(i%4==0&&i%100!=0)){
    							num2++;
    						}
    						switch(ii){
    							case 12:total_day+=30;
    							case 11:total_day+=31;
    							case 10:total_day+=30;
    							case 9:total_day+=31;
    							case 8:total_day+=31;
    							case 7:total_day+=30;
    							case 6:total_day+=31;
    							case 5:total_day+=30;
    							case 4:total_day+=31;
    							case 3:total_day+=num2;
    							case 2:total_day+=31;
    							case 1:break;
    						}
    						total_day+=atoi(temps2.c_str());
    						total_day-=1;
    						int week=(total_day%7+4)%7;
    						/*if(command=="go_to_bed"&&(i==2018)){
    							cout<<"total_day:"<<total_day<<endl;
    							cout<<"week:"<<week<<endl;
    							cout<<"temp_dayofweek:"<<temp_dayofweek<<endl;
    							cout<<temps1<<temps2<<endl;
    						}*/
    						if(temp_dayofweek.find(Int_to_String(week))==string::npos){
    							continue;
    						}
    					}
    					istringstream inputString3(temp_hou);
    					while(inputString3>>temps3){
    						istringstream inputString4(temp_min);
    						while(inputString4>>temps4){
    							temps1=temps1.length()==1?(temps1="0"+temps1):temps1;
    							temps2=temps2.length()==1?(temps2="0"+temps2):temps2;
    							temps3=temps3.length()==1?(temps3="0"+temps3):temps3;
    							temps4=temps4.length()==1?(temps4="0"+temps4):temps4;
    							result=Int_to_String(i)+temps1+temps2+temps3+temps4;
    							if(result>=s&&result<t)
    								mmps[result].push_back(command);
    						}
    					}
    				}
    			}		
    		}
    	}
    	for(map<string,vector<string> >::iterator it=mmps.begin();it!=mmps.end();++it)
        {
            map<string,int> isprt;
            for(size_t i=0;i<it->second.size();++i)
            {
                string dis=it->first+" "+it->second[i];
                if(isprt.count(dis)==0)
                {
                    cout<<dis<<endl;
                    isprt[dis]=1;
                }
            }
        }
    	return 0;
    }
    

      

  • 相关阅读:
    C++ 将对象写入文件 并读取
    IronPython fail to add reference to WebDriver.dll
    How to Capture and Decrypt Lync Server 2010 TLS Traffic Using Microsoft Tools
    .net code injection
    数学系学生应该知道的十个学术网站
    Difference Between Currency Swap and FX Swap
    Swift开源parser
    谈谈我对证券公司一些部门的理解(前、中、后台)[z]
    JDK8记FullGC时候Metaspace内存不会被垃圾回收
    JVM源码分析之JDK8下的僵尸(无法回收)类加载器[z]
  • 原文地址:https://www.cnblogs.com/JsonZhangAA/p/8511205.html
Copyright © 2011-2022 走看看