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;
}