BZOJ 1198 [HNOI2006]军机调度:dfs
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1198
题意:
有n个雇佣军,m个任务。
第i个雇佣军能够参加cnt个任务,分别为temp[0 to cnt-1]。
第i个任务开始时间为start[i],结束时间为over[i],需要person[i]个人参加才能够完成,完成的报酬为reward[i]。
一项只需要n个人来完成的任务,如果执行该任务的人数p大于n,那么反而会得到更少的报酬,即原报酬的1/(p-n+1)。
一个人不能同时执行两项任务,也不能中途加入或者退出任务。但可以不执行任何任务。
问你能够获得的最大报酬。
题解:
dfs暴搜。。。
表示状态:
dfs(mis, per, now, val)
mis:考虑到第mis个任务
per:考虑到第per个人
now:已经参加任务mis的人数
val:已经获得的报酬(不算mis)
dfs:
首先按任务的start从小到大排序。
(1)mis == m:
搜到底了,更新ans = max val。
(2)per == n || now == mission[mis].person:
per == n 表示没有人可选了
now == mission[mis].person 表示人数已经达到任务mis的要求,再加人报酬会变小,不加人可能使答案更优。
此时进入到下一个任务 mis + 1,然后return当前的dfs(不存在)。
(3)fre[per] < mission[mis].start && edge[per][mission[mis].idx]
数组fre[per]代表在之前的决策中,士兵per所执行任务的最后一天。
fre[per] < mission[mis].start:任务mis开始时,士兵per之前的任务已结束。
edge[per][mission[mis].idx]:士兵per可以参加任务mis。
若满足,则让士兵per参加mis。更新fre[per],dfs(mis,per+1,now+1,val),然后恢复fre。
(4)dfs(mis,per+1,now,val):
也可以不选per。
AC Code:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define MAX_N 15
#define MAX_M 20 using namespace std; struct Mission
{
int start;
int over;
int person;
int reward;
int idx;
Mission(int _start,int _over,int _person,int _reward,int _idx)
{
start=_start;
over=_over;
person=_person;
reward=_reward;
idx=_idx;
}
Mission(){}
void read_mission(int _idx)
{
cin>>start>>over>>person>>reward;
idx=_idx;
}
friend bool operator < (const Mission &a,const Mission &b)
{
return a.start<b.start;
}
}; int n,m;
int ans=;
int fre[MAX_N];
bool edge[MAX_N][MAX_M];
Mission mission[MAX_M]; void read()
{
memset(edge,false,sizeof(edge));
cin>>n>>m;
for(int i=;i<n;i++)
{
int counter;
cin>>counter;
for(int j=;j<counter;j++)
{
int temp;
cin>>temp;
edge[i][temp-]=true;
}
}
for(int i=;i<m;i++)
{
mission[i].read_mission(i);
}
} void dfs(int mis,int per,int now,int val)
{
if(mis==m)
{
ans=max(ans,val);
return;
}
if(per==n || now==mission[mis].person)
{
int adv=(now==mission[mis].person?mission[mis].reward:);
dfs(mis+,,,val+adv);
return;
}
if(fre[per]<mission[mis].start && edge[per][mission[mis].idx])
{
int temp=fre[per];
fre[per]=mission[mis].over;
dfs(mis,per+,now+,val);
fre[per]=temp;
}
dfs(mis,per+,now,val);
} void solve()
{
memset(fre,,sizeof(fre));
sort(mission,mission+m);
dfs(,,,);
} void print()
{
cout<<ans<<endl;
} int main()
{
read();
solve();
print();
}
BZOJ 1198 [HNOI2006]军机调度:dfs的更多相关文章
- BZOJ 1198: [HNOI2006]军机调度(搜索)
直接暴搜就行了= = CODE: #include<cstdio> #include<iostream> #include<cstring> #include< ...
- 1198: [HNOI2006]军机调度 - BZOJ
Description 凯萨拥有一支由n个人组成的雇佣军,他们靠在威尼斯商行接任务过活.这支军队的成份比较复杂,不同的人往往具有不同的技能,有的人还拥有多项技能.威尼斯商行的任务也参差不齐,有的需要几 ...
- BZOJ 1191: [HNOI2006]超级英雄Hero 二分匹配
1191: [HNOI2006]超级英雄Hero Description 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或 ...
- bzoj 1195: [HNOI2006]最短母串 爆搜
1195: [HNOI2006]最短母串 Time Limit: 10 Sec Memory Limit: 32 MBSubmit: 894 Solved: 288[Submit][Status] ...
- 图论(Tarjan缩点):BZOJ 1194: [HNOI2006]潘多拉的盒子
1194: [HNOI2006]潘多拉的盒子 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 344 Solved: 181[Submit][Stat ...
- BZOJ 1194: [HNOI2006]潘多拉的盒子( BFS + tarjan + dp )
O(S²)枚举2个诅咒机, 然后O(n²)BFS去判断. 构成一个有向图, tarjan缩点, 然后就是求DAG的最长路.. ------------------------------------- ...
- BZOJ 1191: [HNOI2006]超级英雄Hero 匈牙利算法
1191: [HNOI2006]超级英雄Hero Time Limit: 2 Sec Memory Limit: 256 MBSubmit: xxx Solved: 2xx 题目连接 http:/ ...
- bzoj 3752: Hack 预处理+暴力dfs
题目大意: 定义字符串的hash值\(h = \sum_{i=0}^{n-1}p^{n-i-1}s_i\) 现在给定K个长度不超过L的字符串S,对于每个字符串S,求字典序最小长度不超过L的字符串T使得 ...
- Bzoj 1085: [SCOI2005]骑士精神 (dfs)
Bzoj 1085: [SCOI2005]骑士精神 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 dfs + 剪枝. 剪枝方法: ...
随机推荐
- 4种使用webpack提升vue应用的方式
本文参考自:https://mp.weixin.qq.com/s?src=11×tamp=1526886111&ver=889&signature=u9SixhvlJ ...
- 分享下多年积累的对JAVA程序员成长之路的总结
http://blog.csdn.net/zhongzelin/article/details/8643269我也搞了几年JAVA了,由于一向懒惰,没有成为大牛,只是一普通程序猿,不爱玩社交网站,不爱 ...
- webpack3.0 环境搭建
额.备份一下总是好的 #为了避免某些国外镜像源安装失败,先设置淘宝镜像代理 yarn config set registry https://registry.npm.taobao.org # 初始化 ...
- 【转】【Axure学习】之短信动态验证码+图片动态验证码
感谢:努力拼搏的80后的<巧用Axure三步轻松搞定图片验证码>. 人人都是产品经理的<Axure 教程:实现倒计时获取验证码效果>
- beego的MVC架构介绍
beego 的 MVC 架构介绍 beego 是一个典型的 MVC 框架,它的整个执行逻辑如下图所示: 通过文字来描述如下: 在监听的端口接收数据,默认监听在 8080 端口. 用户请求到达 8080 ...
- php类中const
常量 const 在类里面定义常量用 const 关键字,而不是通常的 define() 函数. 语法: const constant = "value"; 例子: <?ph ...
- React中key的必要性与使用
React这个框架的核心思想是,将页面分割成一个个组件,一个组件还可能嵌套更小的组件,每个组件有自己的数据(属性/状态);当某个组件的数据发生变化时,更新该组件部分的视图.更新的过程是由数据驱动的,新 ...
- 实现RTSP网站微信直播方案EasyNVR(linux版)部署问题之:ERR_CONTENT_LENGTH_MISMATCH
发现问题: 想要优化一下EasyNVR相关功能,内部测试软件,于是在linux系统中部署了一台EasyNVR.当部署好,运行起来发现问题: EasyNVR的配置页面数据出不来. 分析问题: 基于是we ...
- 【oracle案例】ORA-01102: cannot mount database in EXCLUSIVE mode
ORA-01102: cannot mount database in EXCLUSIVE mode 今天在fedora上安装完10g后,测试数据库是否安装成功.STARTUP数据库时,发生如下错误: ...
- 关于EF输出sql的执行日志
sqlserver中可以使用sql profiler:但是mysql当中无法查看:只能借助于组件: ADO.NET Entity Framework CodeFirst 如何输出日志(EF4.3) 用 ...