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 + 剪枝. 剪枝方法: ...
随机推荐
- AutoCAD如何移动零件和缩放零件图
如下图所示,我想要把这个零件放大并移动到图纸的中央,先全部选中这个零件,方法是在左上角点一下,然后拖出一个矩形包围整个零件 然后点击右侧的缩放命令,底部的命令栏变成指定基点的时候,在这个图纸的右上 ...
- openLayers加载高德地图
之前用openlayers对高德,百度,腾讯,bing,supermap,天地图,arcgis,google等地图进行了对接,今天简单介绍一下openlayers+高德: 在Openlayers.La ...
- linux挂载硬盘
最近有个生产机由于缓存问题,硬盘不太够用,所以就加载了一块硬盘,下面把挂载硬盘的过程记录下,供大家参考,有问题欢迎留言! fdisk –l ------------------------------ ...
- GetDlgItem() 出现错误
写MFC程序ASSERT(IsWindow(pTemp->m_hWnd))报错 CRect rect; CWnd *pWnd = GetDlgItem(IDC_picture);//IDC_pi ...
- js 原生方法获取所有兄弟节点
<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...
- css样式控制元素固定在底部
回复固定在底部:css样式用到了 box-sizing属性 box-sizing:border-box; -moz-box-sizing:border-box; /* Firefox */ -webk ...
- jdbcTemplaate queryForObject的两个易混淆的方法
JdbcTemplate中有两个可能会混淆的queryForObject方法: 1. Object queryForObject(String sql, Object[] args, Class ...
- FreeRTOS在神舟IV号开发板的应用demo
下面一个可以直接编译运行的例子,FreeRTOS的版本是V7.1.0,芯片是STM32F107VCT6,使用的开发环境是Keil uVision5. 这里例子创建了四个任务,每个任务控制一个LED的亮 ...
- XMLHttpRequest cannot load ''. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin ' ' is therefore not allowed access.
ajax跨域 禁止访问! 利用Access-Control-Allow-Origin响应头解决跨域请求
- iis出现HTTP 错误 403.14 - Forbidden Web问题
找到"目录浏览",并"应用"