POJ 1167 The Buses 暴搜+剪枝
2024-08-31 16:20:57
思路:
先把能选的路线都预处理出来
按照能停的车的多少排个序 (剪枝1)
搜搜搜
如果当前剩的车÷当前能停车的多少+deep>=ans剪掉 (剪枝2)
//By SiriusRen
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,vis[60],xx,cnt,ans=17;
struct Route{int start,gap,all;}route[1005];
bool check(int start,int gap){
for(int i=start;i<60;i+=gap)
if(!vis[i])return 0;
return 1;
}
bool cmp(Route a,Route b){return a.all>b.all;}
void dfs(int x,int deep,int remain){
if(remain/route[x].all+deep>=ans)return;
if(!remain){ans=min(ans,deep);return;}
for(int i=x;i<=cnt;i++){
if(check(route[i].start,route[i].gap)){
for(int j=route[i].start;j<60;j+=route[i].gap)
vis[j]--;
dfs(i,deep+1,remain-route[i].all);
for(int j=route[i].start;j<60;j+=route[i].gap)
vis[j]++;
}
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&xx),vis[xx]++;
for(int i=0;i<30;i++)
for(int j=i+1;i+j<60;j++)
if(check(i,j)){
route[++cnt].gap=j,route[cnt].start=i;
for(int k=route[cnt].start;k<60;k+=route[cnt].gap)route[cnt].all++;
}
sort(route+1,route+1+cnt,cmp);
dfs(1,0,n);
printf("%d\n",ans);
}
最新文章
- Javascript下拉导航
- insertAfter的兼容性
- R绘图基础
- 【团队项目演示】FZU5BOYS之团队项目链接汇总
- [Js]面向对象基础
- what is docker
- C#一个简单下载程序实例(可用于更新)
- 山东理工大学ACM平台题答案关于C语言 1543 Egypt
- 换行符以及for循环的优化
- XML文档的PHP程序查询代码
- 【转载】jQuery全屏滚动插件fullPage.js
- 【BZOJ5332】[SDOI2018]旧试题(数论,三元环计数)
- 114. Flatten Binary Tree to Linked List(M)
- hibernate重要知识点总结
- 重新入坑-IntelliJ Maven
- 42 前端HTML
- input文字垂直居中和按钮对齐问题,兼容IE8
- 1854. [SCOI2010]游戏【二分图】
- linux时区问题
- Dijkstra+优先队列 堆优化