http://acm.pku.edu.cn/JudgeOnline/problem?id=1167

Код:
#include<iostream>
#include<algorithm>

using namespace std;

struct Busroute{
      int start;
      int interval;
      int times;
      bool operator < (const Busroute & obj) const {
            return times > obj.times;
      }
};
Busroute Bus[910];
int arrive[60];
int total_bus,leftbus,mist ,c_nt;

bool check(int start,int interval){ //判断以start作为开始时间,以intervalдЅњдёєй—ґйљ”ж—¶й—ґж˜Їеђ¦еђ€жі• 
    if(start + interval >= 60)  return false;
       for(int i = start; i < 60; i+= interval)
         if (! arrive[i]) return false;
     return true;
}
void update(int index,int flag){
      for (int i = Bus[index].start; i < 60; i+= Bus[index].interval)
         arrive[i] += flag,leftbus += flag;
}
void DFS(int index,int rts){
      if(leftbus == 0){
          mist = mist < rts ? mist : rts;
          return;
      }
      else {
            int tmp = index;
            while (tmp < c_nt && Bus[tmp].times > leftbus) tmp++;
            for(tmp; tmp < c_nt; tmp ++){
                // й‡Ќи¦Ѓзљ„е‰Єжћќ

                if(rts + 1+(leftbus - Bus[tmp].times)/Bus[tmp].times >= mist)  return;
                if(check(Bus[tmp].start,Bus[tmp].interval)){
                    update(tmp,-1);
                    DFS(tmp,rts + 1);
                    update(tmp, 1);
                }
            }
      }
}
int slove(){
    mist = 17;
    leftbus = total_bus;
    DFS(0,0);
    return mist ;
}
int main(int argc, char* argv[])
{

    while(scanf("%d",&total_bus) != EOF){
         int bus;
         memset(arrive,0,sizeof(arrive));
         for(int i = 0; i < total_bus; i++){
             scanf("%d",&bus);
             arrive[bus]++;
         }
         c_nt = 0 ;
         for(int i = 0; i <= 29; i++){ // ж‰ѕе‡єж‰Ђжњ‰зљ„еђ€жі•зљ„зєїи·ЇгЂ‚
          if(arrive[i])
             for(int j = i + 1; j < 59 - i; j++){
                 if(check(i,j)){
                     Bus[c_nt].start = i;
                     Bus[c_nt].interval = j;
                     Bus[c_nt++].times = 1 + (59 - i)/j;
                 }
            }
         }
         sort(Bus,Bus + c_nt); // ж №жЌ®жЇЏдёЂи·ЇиЅ¦зљ„иЅ¦ж•°жЋ’еєЏ 
         printf("%d\n",slove());
    }
        return 0;
}