CCF CSP认证201712

编程入门 行业动态 更新时间:2024-10-26 20:24:09

<a href=https://www.elefans.com/category/jswz/34/1763261.html style=CCF CSP认证201712"/>

CCF CSP认证201712

201712-3 Crontab

题目

思路

日期处理+字符串处理。目前代码最长的一题,太复杂了。
只有50分,目前尚未找到问题所在。详见代码。


已AC,就打错一个数字,害我找了那么久的bug,噗!

AC代码如下

#include<bits/stdc++.h> 
using namespace std;
struct task{set<int> cron[5];string cmd;
}tsk[20];
struct node{//优先队列存某天的所有任务,按时间排序int hh,mm,x;bool operator <(const node &a) const{if(hh!=a.hh) return hh>a.hh;if(mm!=a.mm) return mm>a.mm;return x>a.x;} 
}stday,edday;
int ds[2][13]={{0,31,28,31,30,31,30,31,31,30,31,30,31},{0,31,29,31,30,31,30,31,31,30,31,30,31}};
int wd[130][13][32],n,time0[5]={0},time1[5]={0};
string  s,t;
map<string,int> mp={{"jan",1},{"feb",2},{"mar",3},{"apr",4},{"may",5},{"jun",6},{"jul",7},{"aug",8},{"sep",9},{"oct",10},{"nov",11},{"dec",12},{"sun",0},{"mon",1},{"tue",2},{"wed",3},{"thu",4},{"fri",5},{"sat",6}};
set<int> all[5];//为了应对'*'号设置的集合
int forall[5]={61,24,32,13,7};//为了计算楼上的集合设置的数组bool isry(int y) {return y%4==0;}//判断闰年,这里不会有非闰年的整百年void Cal_wd(){//计算每天星期几int t=3,f;for(int i=0;i<130;i++){f=isry(i+1970);for(int j=1;j<=12;j++)for(int k=1;k<=ds[f][j];k++)t=wd[i][j][k]=(t+1)%7;}//cout<<"I know what day!"<<endl;
}void Cal_all(){for(int i=0;i<5;i++)for(int j=0;j<forall[i];j++)all[i].insert(j);
}void get_time(){//计算起止时间for(int i=0;i<4;i++){time0[0]=time0[0]*10+s[i]-'0';time1[0]=time1[0]*10+t[i]-'0';}for(int i=1;i<5;i++){int j=2+2*i;time0[i]=(s[j]-'0')*10+s[j+1]-'0';time1[i]=(t[j]-'0')*10+t[j+1]-'0';}//cout<<"time got!"<<endl;
}int get_num(int &j,string  temp){//取数int a=0;while(j<temp.size()&&temp[j]>='0'&&temp[j]<='9'){//取一个数 a=a*10+temp[j]-'0';j++;}if(j<temp.size()&&temp[j]>='a'&&temp[j]<='z'){//取一个缩写并转换为数 a=mp[temp.substr(j,3)];j+=3;}return a;
}void My_get(int x){//读入第x条配置信息string temp;for(int i=0;i<5;i++){cin>>temp;transform(temp.begin(),temp.end(),temp.begin(),::tolower);//转换为小写if(temp=="*") {tsk[x].cron[i]=all[i];continue;}int j=0,a=0;while(j<temp.size()){if(temp[j]==','){//遇到逗号,收录前一个数,准备读取下一个数 tsk[x].cron[i].insert(a);a=0;j++;}a=get_num(j,temp);if(j>=temp.size()){//读取结束 tsk[x].cron[i].insert(a);break;}if(temp[j]=='-'){//遇到'-' int b=get_num(++j,temp);for(int k=a;k<=b;k++)tsk[x].cron[i].insert(k);}}}cin>>tsk[x].cmd;}void solve2(int y,int m,int d,int flag){//对每天求解priority_queue<node> q;if(flag==1) {q.push(stday);q.push(edday);}else if(flag==2) q.push(stday);else if(flag==3) q.push(edday);for(int j=0;j<n;j++){if(tsk[j].cron[3].count(m)&&tsk[j].cron[2].count(d)&&tsk[j].cron[4].count(wd[y-1970][m][d]))for(set<int>::iterator it1=tsk[j].cron[1].begin();it1!=tsk[j].cron[1].end();it1++)for(set<int>::iterator it2=tsk[j].cron[0].begin();it2!=tsk[j].cron[0].end();it2++)q.push((node){*it1,*it2,j});}while(!q.empty()){node now=q.top();q.pop();if(now.x==-2) return;if(flag==0){printf("%d%02d%02d%02d%02d ",y,m,d,now.hh,now.mm);cout<<tsk[now.x].cmd<<endl;}if(flag&&now.x==-1) flag=0;}
}void solve(){stday={time0[3],time0[4],-1};edday={time1[3],time1[4],-2};int f=isry(time0[0]);if(time0[0]==time1[0]){//同年 if(time0[1]==time1[1]){//同月 if(time0[2]==time1[2]){//同日 solve2(time0[0],time0[1],time0[2],1);return;}solve2(time0[0],time0[1],time0[2],2);//首日 for(int i=time0[2]+1;i<time1[2];i++)solve2(time0[0],time0[1],i,0);solve2(time1[0],time1[1],time1[2],3);//末日 return;}solve2(time0[0],time0[1],time0[2],2);//首日for(int i=time0[2]+1;i<=ds[f][time0[1]];i++)//首月 solve2(time0[0],time0[1],i,0);for(int i=time0[1]+1;i<time1[1];i++)//中间月份 for(int j=1;j<=ds[f][i];j++)solve2(time0[0],i,j,0);}else{//不同年 solve2(time0[0],time0[1],time0[2],2);//首日for(int i=time0[2]+1;i<=ds[f][time0[1]];i++)//首月 solve2(time0[0],time0[1],i,0);for(int i=time0[1]+1;i<=12;i++)//首年 for(int j=1;j<=ds[f][i];j++)solve2(time0[0],i,j,0);for(int i=time0[0]+1;i<time1[0];i++){//中间年份 f=isry(i);for(int j=1;j<=12;j++)for(int k=1;k<=ds[f][j];k++)solve2(i,j,k,0);}f=isry(time1[0]);for(int i=1;i<time1[1];i++)//末年 for(int j=1;j<=ds[f][i];j++)solve2(time1[0],i,j,0);}for(int i=1;i<time1[2];i++)//末月 solve2(time1[0],time1[1],i,0);solve2(time1[0],time1[1],time1[2],3);//末日 
}int main(){cin>>n>>s>>t;get_time();Cal_all();for(int i=0;i<n;i++) My_get(i);Cal_wd();solve();return 0;
}

更多推荐

CCF CSP认证201712

本文发布于:2024-03-10 18:19:32,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1728694.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:CCF   CSP

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!