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 + 剪枝. 剪枝方法: ...
随机推荐
- 一款很实用的Memcache监控工具
装了memcahce以后想对使用情况详细了解一下,如分配的内存够不够,都存了什么,经百度后发现这款工具灰常实用!此工具来自Memcache Pecl 中 http://pecl.php.net/pac ...
- mha安装报错 [error][/usr/share/perl5/vendor_perl/MHA/MasterMonitor.pm, ln361] None of slaves can be master. Check failover configuration file or log-bin settings in my.cnf
查找资料 参考 http://blog.51cto.com/16769017/1878451 解决方法: 在两个从库上开启二进制日志即可(花了 一天时间,找不到解决方法,最后还是靠自己的理解及测试解决 ...
- (三)初识jQuery
进入jQuery官网:http://jquery.com/ 点击Download jQuery v3.1.1--->下载最新版本的jQuery版本--->放到你需要引入jQuery的文件中 ...
- Flex版的2048游戏
近期2048游戏好像挺火.在公交,吃饭,甚至在路上走路都有人拿着手机在玩,之前我看同事玩,认为非常幼稚,移来移去太无聊了吧 到后面自己也下了.发现确实挺无聊的,也就是在无聊的时候打发无聊的时间,后来就 ...
- linux中下载JDK 1.7
今天想linux下安装java,然后就使用wget来下载jdk1.7,结果老是报错,大概意思是cookie有问题.如下图: 然后网上看了一下,下面的地址可以下载: wget --no-cookies ...
- webpack 样式分离之The root route must render a single element
公司项目使用的是webpack1,使用extract-text-webpack-plugin 插件无法将css分离出来,检查原因,发现有如下代码 <Route path="/home& ...
- SSIS
http://www.cnblogs.com/codefish/category/557802.html
- 【BZOJ3796】Mushroom追妹纸 二分+hash
[BZOJ3796]Mushroom追妹纸 Description Mushroom最近看上了一个漂亮妹纸.他选择一种非常经典的手段来表达自己的心意——写情书.考虑到自己的表达能力,Mushroom决 ...
- EasyDSS高性能流媒体服务器前端重构(五)- webpack + vue-router 开发单页面前端实现按需加载 - 副本
为了让页面更快完成加载, 第一时间呈现给客户端, 也为了帮助客户端节省流量资源, 我们可以开启 vue-router 提供的按需加载功能, 让客户端打开页面时, 只自动加载必要的资源文件, 当客户端操 ...
- 微信小程序设计指南
微信小程序设计指南 · 小程序 https://developers.weixin.qq.com/miniprogram/design/index.html