提交后得100分的C++程序如下:
#include<bits/stdc++.h> using namespace std; const char *weeks_months[]={"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; const int days[]={0,31,28,31,30,31,30,31,31,30,31,30,31}; int leapyear(int year,int month) //处理闰年情况 { if(month==2){ return(((year%4==0)&&(year%100!=0))||(year%400==0))?1:0; } return 0; } vector<pair<int ,int> > v[5]; string cmd;//命令行 struct CMD{ int id; long long time; string cmd; bool operator<(const CMD &a) const //排序 { return (time==a.time)? id>a.id: time>a.time; } }; char buf[256]; int getval(char t[]) //根据月份,星期的英文得到数字 { int i; t[0]=toupper(t[0]);//首字母大写 for(i=1;t[i];i++) t[i]=tolower(t[i]); for(i=0;i<12+7;i++) { if(strcmp(t,weeks_months[i])==0) break; } if(i<12+7) return i<7? i:i-6; return -1; } void setsubval(char s[],vector<pair<int,int> >&v)//pair类型表示一个范围。任意的范围就用<-1,-1>表示 { int p1 = 0, p2 = 0; for(int i = 0; s[i]; i++) if(s[i] == '-') { s[i] = '\0'; p2 = i + 1; break; } int val1, val2; if(p1 == p2) { if(isdigit(s[0])) val1 = atoi(s); else val1 = getval(s); v.push_back(make_pair(val1, val1)); } else { if(isdigit(s[0])) val1 = atoi(s); else val1 = getval(s); if(isdigit(s[p2])) val2 = atoi(s + p2); else val2 = getval(s + p2); v.push_back(make_pair(val1, val2)); } } void setval(char s[],vector<pair<int ,int> >&v){ if(s[0]=='*') v.push_back(make_pair(-1,-1)); else{ char *p=strtok(s,","); while(p){ setsubval(p,v); p=strtok(NULL,","); } } } int myatoi(char t[],int b,int e) { int v=0; for(int i=b;i<=e;i++){ v=v*10+t[i]-'0'; } return v; } bool judge(int m,vector<pair<int,int> >& v){ for(int i=0;i<(int)v.size();i++){ if(v[i].first==-1||(v[i].first<=m&&m<=v[i].second)) { return true; } } return false; } bool end_time_check(int y,int m,int d,int h,int mi, int ey, int em, int ed, int eh, int emi) { if(y<ey) return true; if(m>em) return false; if(m<em) return true; if(d>ed) return false; if(d<ed) return true; if(h>eh) return false; if(h<eh) return true; if(mi>emi) return false; if(mi<emi) return true; return false; } int weekday(int year,int month,int day) //蔡勒公式 { if(month == 1 || month == 2) { month += 12; year--; } int c = year / 100; int y = year % 100; int m = month; int d = day; int w = c / 4 - 2 * c + y + y / 4 + 26 * (m + 1) / 10 + d - 1; if(w < 0) return (w + (-w / 7 + 1) * 7) % 7; return w % 7; } int main(){ int n; string s,t; priority_queue<CMD> q; cin>>n>>s>>t; strcpy(buf,s.c_str()); int sy = myatoi(buf, 0, 3); int sm = myatoi(buf, 4, 5); int sd = myatoi(buf, 6, 7); int sh = myatoi(buf, 8, 9); int smi = myatoi(buf, 10, 11); strcpy(buf, t.c_str()); int ey = myatoi(buf, 0, 3); int em = myatoi(buf, 4, 5); int ed = myatoi(buf, 6, 7); int eh = myatoi(buf, 8, 9); int emi = myatoi(buf, 10, 11); for(int i=0;i<n;i++){ string ss;//处理每行的分钟,小时,日,月份,星期 for(int j=0;j<5;j++){ v[j].clear(); cin>>ss; strcpy(buf,ss.c_str()); setval(buf,v[j]); } cin>>cmd; int k=sm,l=sd,m=sh,n=smi;//月,日,小时,分钟循环 for(int j = sy; j <= ey; j++, k=1) // 年循环处理 for(; k <= 12; k++, l = 1) if(judge(k, v[3])) for(; l <= days[k] + leapyear(j, k); l++, m = 0) if(judge(l, v[2]) && judge(weekday(j, k, l), v[4])) for(; m < 24; m++, n = 0) if(judge(m, v[1])) for(; n < 60; n++) { if(!end_time_check(j, k, l, m, n, ey, em, ed, eh, emi)) break; if(judge(n, v[0])) { CMD tmp; tmp.id = i; tmp.time = (long long)j * 100000000 + (long long)k * 1000000 + (long long)l * 10000 + (long long)m * 100 + n; tmp.cmd = cmd; q.push(tmp); } } } while(!q.empty()){ CMD tmp=q.top(); q.pop(); cout<<tmp.time<<" "<<tmp.cmd<<endl; } return 0; }