ccf2017-12-3 crontab

思路:
思路是用标记数组储存信息,然后按天数模拟,每天遍历一遍cron,把符合的cron放进vector里,接着再模拟这一天的时间,对于每一分钟检查vector里的cron是否有满足的,有就输出。
本题需注意:
1、字母不区分大小写
2、最后一分钟取不到
3、最后一天要拿出来单独处理
4、输出的月份,日期,小时,分钟必须是两位数(例如6则输出06)
5、时间相同则按输入顺序输出
最后,还请大佬们指点一下本蒟蒻为什么只有95分~
版权声明:本文为原创文章,转载请标明出处。
https://blog.csdn.net/u014390156

#include<iostream>
#include<string>
#include<cstdio>
#include<vector>
#define rep(i,x,n) for(int i=x;i<n;i++)
using namespace std;
#define ll long long
int day[25][32];
int week[25][8];
int month[25][16];
int hour[25][26];
int mi[25][60];
string con[25];
string in[6];
string s,t;
string mon[13]={"hahaha","jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"};
string wk[7]={"sun","mon","tue","wed","thu","fri","sat"};
vector<int>q;
int n;
int y1,m1,d1,w1,h1,mi1,y2,m2,d2,w2,h2,mi2;
int ts(int y,int m)
{
    if(m==1||m==3||m==5||m==7||m==8||m==10||m==12)return 31;
    if(m==4||m==6||m==9||m==11)return 30;
    if(m==2&&(y%400==0||(y%4==0&&y%100!=0)))return 29;
    return 28;
}
void lit(string &ss)
{
    int len=ss.length();
    rep(i,0,len){if(ss[i]>='A'&&ss[i]<='Z')ss[i]-=('A'-'a');}
}
void change(int x)
{
     int len=in[0].length(),tmp1=0,tmp2=0;
     bool flag=0;
     rep(i,0,len)
     {
         if(in[0][i]=='*'){rep(j,0,60)mi[x][j]=1;break;}
         else if(in[0][i]=='-'){flag=1;}
         else if(in[0][i]==','){if(flag)rep(j,tmp1,tmp2+1)mi[x][j]=1;else mi[x][tmp1]=1;tmp1=0;tmp2=0;flag=0;}
         else {if(flag)tmp2=tmp2*10+(in[0][i]-'0');else tmp1=tmp1*10+(in[0][i]-'0');}
     }
     if(flag)rep(j,tmp1,tmp2+1)mi[x][j]=1;else mi[x][tmp1]=1;
     //分钟
     len=in[1].length();tmp1=0;tmp2=0;flag=0;
     rep(i,0,len)
     {
         if(in[1][i]=='*'){rep(j,0,24)hour[x][j]=1;break;}
         else if(in[1][i]=='-'){flag=1;}
         else if(in[1][i]==','){if(flag)rep(j,tmp1,tmp2+1)hour[x][j]=1;else hour[x][tmp1]=1;tmp1=0;tmp2=0;flag=0;}
         else {if(flag)tmp2=tmp2*10+(in[1][i]-'0');else tmp1=tmp1*10+(in[1][i]-'0');}
     }
     if(flag)rep(j,tmp1,tmp2+1)hour[x][j]=1;else hour[x][tmp1]=1;
     //小时
     len=in[2].length();tmp1=0;tmp2=0;flag=0;
     rep(i,0,len)
     {
        if(in[2][i]=='*'){rep(j,1,32)day[x][j]=1;break;}
         else if(in[2][i]=='-'){flag=1;}
         else if(in[2][i]==','){if(flag)rep(j,tmp1,tmp2+1)day[x][j]=1;else day[x][tmp1]=1;tmp1=0;tmp2=0;flag=0;}
         else {if(flag)tmp2=tmp2*10+(in[2][i]-'0');else tmp1=tmp1*10+(in[2][i]-'0');}
     }
    if(flag)rep(j,tmp1,tmp2+1)day[x][j]=1;else day[x][tmp1]=1;
    //日期
       len=in[3].length();
        tmp1=0;tmp2=0;flag=0;
        rep(i,0,len)
        {
            if(in[3][i]=='*'){rep(j,1,13)month[x][j]=1;break;}
            else if(in[3][i]=='-'){flag=1;}
            else if(in[3][i]==','){if(flag)rep(j,tmp1,tmp2+1)month[x][j]=1;else month[x][tmp1]=1;tmp1=0;tmp2=0;flag=0;}
            else if(in[3][i]>'9'||in[3][i]<'0')
            {
                string tmps(in[3].begin()+i-1,in[3].begin()+i+2);
                 lit(tmps);
                 rep(j,1,13)if(tmps==mon[j]){if(flag)tmp2=j;else tmp1=j;break;}
            }
            else {if(flag)tmp2=tmp2*10+(in[3][i]-'0');else tmp1=tmp1*10+(in[3][i]-'0');}
        }
   if(flag)rep(j,tmp1,tmp2+1)month[x][j]=1;else month[x][tmp1]=1;tmp1=0;tmp2=0;flag=0;
   //月份
    len=in[4].length();
        tmp1=0;tmp2=0;flag=0;
        rep(i,0,len)
        {
            if(in[4][i]=='*'){rep(j,0,7)week[x][j]=1;break;}
            else if(in[4][i]=='-'){flag=1;}
            else if(in[4][i]==','){if(flag)rep(j,tmp1,tmp2+1)week[x][j]=1;else week[x][tmp1]=1;tmp1=0;tmp2=0;flag=0;}
            else if(in[4][i]>'9'||in[4][i]<'0')
            {
                string tmps(in[4].begin()+i-1,in[4].begin()+i+2);
                lit(tmps);
                 rep(j,0,7)if(tmps==wk[j]){if(flag)tmp2=j;else tmp1=j;break;}
            }
            else {if(flag)tmp2=tmp2*10+(in[4][i]-'0');else tmp1=tmp1*10+(in[4][i]-'0');}
        }
   if(flag)rep(j,tmp1,tmp2+1)week[x][j]=1;else week[x][tmp1]=1;
   //星期
}
int main()
{
    int yt,mt;
    bool flag=0;
    cin>>n;cin>>s>>t;
    string ss;
    rep(i,0,4)y1=y1*10+(s[i]-'0');rep(i,4,6)m1=m1*10+(s[i]-'0');
    rep(i,6,8)d1=d1*10+(s[i]-'0');rep(i,8,10)h1=h1*10+(s[i]-'0');rep(i,10,12)mi1=mi1*10+(s[i]-'0');
    rep(i,0,4)y2=y2*10+(t[i]-'0');rep(i,4,6)m2=m2*10+(t[i]-'0');
    rep(i,6,8)d2=d2*10+(t[i]-'0');rep(i,8,10)h2=h2*10+(t[i]-'0');rep(i,10,12)mi2=mi2*10+(t[i]-'0');
    rep(i,0,n)
    {
        rep(j,0,6)cin>>in[j];
        con[i]=in[5];
        change(i);
    }
    if(m1==1){mt=13;yt=y1-1;}
        else if(m1==2){mt=14;yt=y1-1;}
        else {mt=m1;yt=y1;}
      int c=int(yt/100);yt=yt-100*c;
     w1=int(c/4)-2*c+yt+int(yt/4)+(26*(mt+1)/10)+d1-1;
     w1=(w1%7+7)%7;
     vector<int>::iterator iter;
    while(1)
    {
        q.clear();
        rep(i,0,n)
          if(day[i][d1]&&month[i][m1]&&week[i][w1])
             q.push_back(i);
              rep(j,0,24)
              rep(k,0,60)
              for(iter=q.begin();iter!=q.end();iter++)
              {
                  int i=*iter;if(hour[i][j]&&mi[i][k])
                  {printf("%d%02d%02d%02d%02d ",y1,m1,d1,j,k);cout<<con[i]<<endl;}
              }
        d1+=1;w1++;w1%=7;
        if(d1==ts(y1,m1)+1){d1=1;m1++;if(m1==13){m1=1;y1++;}}
        if(y1>y2)break;
        else if(y1==y2)
        {
            if(m1>m2)break;
            else if(m1==m2)
            {
                if(d1>d2)break;
                else if(d1==d2)
                    {flag=1;break;}
            }
        }
    }
    if(flag==1)
    {q.clear();
        rep(i,0,n)
          if(day[i][d1]&&month[i][m1]&&week[i][w1])q.push_back(i);
              rep(j,0,h2)
              rep(k,0,60)
              for(iter=q.begin();iter!=q.end();iter++)
            {
                int i=*iter;
                if(hour[i][j]&&mi[i][k])
                    {printf("%d%02d%02d%02d%02d ",y1,m1,d1,j,k);cout<<con[i]<<endl;}
            }
              rep(k,0,mi2)for(iter=q.begin();iter!=q.end();iter++)
              {
                  int i=*iter;
                  if(hour[i][h2]&&mi[i][k])
                    {printf("%d%02d%02d%02d%02d ",y1,m1,d1,h2,k);cout<<con[i]<<endl;}
              }

    }
return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值