zoukankan      html  css  js  c++  java
  • CCF-Crontab-201712-3

    大概是CCf第三题中最麻烦的一个吧

          我的思路其实我觉得还可以,模拟...可是超时了233 只有90分 [ 可是我看网上其他人也是模拟算法啊,

          速度还是太慢了 120行, 1个半小时  大部分花在了debug上了

          总结: debug时 不要直接看中间结果,先自己仔细读一遍程序,很多bug不是逻辑错误,而是自己不细心....加油!!

      1 #include <bits/stdc++.h>
      2 using namespace std;
      3 struct node {
      4     string name;
      5     bool isok[6][65];
      6 };
      7 node ord[50];
      8 int mon[][13]={0,31,28,31,30,31,30,31,31,30,31,30,31,
      9                0,31,29,31,30,31,30,31,31,30,31,30,31};
     10 string smon[13]={"","jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec"};
     11 string swek[7]={"sun","mon","tue","wed","thu","fri","sat"};
     12 map <string,int> mapp;
     13 int t[10]={0,0,1,1,4,1970}; // min 0,hou 1,day 2,mon 3,week 4,year 5
     14 int ts[10],te[10];
     15 int base[10]={60,24,0,12};
     16 bool is_r (int year) {
     17     if (year%4==0&&year%100!=0||year%400==0) return 1;
     18     return  0;
     19 }
     20 void dd(int k) {
     21     bool flag=is_r(t[5]);
     22     base[2]=mon[flag][t[3]];
     23     for (int i=0;i<=1;i++) {
     24         int tmp=t[i]+k;
     25         k=tmp/base[i]; 
     26         t[i]=tmp%base[i];
     27     }
     28     for (int i=2;i<=3;i++) {
     29         if (i==2) t[4]=(t[4]+k)%7;
     30         int tmp=t[i]-1+k;
     31         k=tmp/base[i];
     32         t[i]=tmp%base[i]+1;
     33     }
     34     t[5]+=k;
     35 }
     36 int to_int (string str) {
     37     int ans=0;
     38     for (int i=0;i<str.size();i++)
     39         ans=ans*10+str[i]-'0';
     40     return ans;
     41 }
     42 void get_t(string str,int* x) {
     43     x[5]=to_int(str.substr(0,4));
     44     for (int i=3,pos=4;i>=0;i--,pos+=2) 
     45         x[i]=to_int(str.substr(pos,2));
     46 }
     47 bool is_same (int *x,int *y) {
     48     for (int i=0;i<=3;i++)
     49         if (x[i]!=y[i]) return 0;
     50     return x[5]==y[5];
     51 }
     52 vector <string> split(string str,const char flag=',') {
     53     vector <string> ans;
     54     istringstream  iss(str);
     55     while (getline(iss,str,flag)) {
     56         if (str.size()) {
     57             for (int i=0;i<str.size();i++)
     58                 if (str[i]>='A'&&str[i]<='Z') 
     59                     str[i]=str[i]-'A'+'a';
     60             ans.push_back(str);
     61         }
     62     }
     63     return ans;
     64 }
     65 int get_num (string str) {
     66     if (str[0]>='0'&&str[0]<='9')  return to_int(str); 
     67     return mapp[str];
     68 }
     69 void get_isok(string str,bool* isok) {
     70     if (str=="*") {
     71         for (int i=0;i<=60;i++) isok[i]=1;
     72         return ;
     73     }
     74     vector <string> sv=split(str);
     75     for (int i=0;i<sv.size();i++) {
     76         string tmp=sv[i];
     77         int pos=tmp.find("-");
     78         if (pos==-1)  isok[get_num(tmp)]=1;
     79         else          {
     80             string s1=tmp.substr(0,pos),s2=tmp.substr(pos+1);
     81             int l1=get_num(s1),l2=get_num(s2);
     82             for (int j=l1;j<=l2;j++)
     83                 isok[j]=1;
     84         }
     85     }
     86 }
     87 bool isok(node x) {
     88     for (int i=0;i<5;i++)
     89         if (!x.isok[i][t[i]]) return 0;
     90     return 1;
     91 }
     92 int main ()
     93 {
     94     ios::sync_with_stdio(false);
     95     for (int i=1;i<=12;i++) mapp[smon[i]]=i;
     96     for (int i=0;i<7;i++)   mapp[swek[i]]=i;
     97     int n; string _s,_e; 
     98     cin>>n>>_s>>_e;
     99     get_t(_s,ts); get_t(_e,te);
    100     t[1]=ts[1]; t[0]=ts[0];
    101     while (!is_same(t,ts)) dd(24*60);
    102     for (int i=1;i<=n;i++) {
    103         for (int j=0;j<5;j++) {
    104             string str; cin>>str;
    105             get_isok(str,ord[i].isok[j]);
    106         }
    107         cin>>ord[i].name;
    108     }
    109     while (!is_same(t,te)) {
    110         for (int i=1;i<=n;i++)
    111             if (isok(ord[i])) {
    112                 cout<<t[5];
    113                 for (int j=3;j>=0;j--)
    114                     cout<<setw(2)<<setfill('0')<<t[j];
    115                 cout<<" "<<ord[i].name<<"
    ";
    116             }
    117         dd(1);
    118     }
    119     return 0;
    120 }
    抓住青春的尾巴。。。
  • 相关阅读:
    解决ORACLE存储过程锁定的问题
    #{propName,attr1=val1,attr2=val2}
    集成confluence与jira
    jira4.1.1安装
    Mac OS X 10.6下安装MySQL 5.1.45
    JIRA+MySQL配置
    xcode4.5 iOS6 cocos2dx 横屏解决方案
    gSoap
    Jira5.0.2安装及破解
    MFC中显示cocos2dx
  • 原文地址:https://www.cnblogs.com/xidian-mao/p/10503027.html
Copyright © 2011-2022 走看看