题目链接: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的更多相关文章

  1. BZOJ 1198: [HNOI2006]军机调度(搜索)

    直接暴搜就行了= = CODE: #include<cstdio> #include<iostream> #include<cstring> #include< ...

  2. 1198: [HNOI2006]军机调度 - BZOJ

    Description 凯萨拥有一支由n个人组成的雇佣军,他们靠在威尼斯商行接任务过活.这支军队的成份比较复杂,不同的人往往具有不同的技能,有的人还拥有多项技能.威尼斯商行的任务也参差不齐,有的需要几 ...

  3. BZOJ 1191: [HNOI2006]超级英雄Hero 二分匹配

    1191: [HNOI2006]超级英雄Hero Description 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或 ...

  4. bzoj 1195: [HNOI2006]最短母串 爆搜

    1195: [HNOI2006]最短母串 Time Limit: 10 Sec  Memory Limit: 32 MBSubmit: 894  Solved: 288[Submit][Status] ...

  5. 图论(Tarjan缩点):BZOJ 1194: [HNOI2006]潘多拉的盒子

    1194: [HNOI2006]潘多拉的盒子 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 344  Solved: 181[Submit][Stat ...

  6. BZOJ 1194: [HNOI2006]潘多拉的盒子( BFS + tarjan + dp )

    O(S²)枚举2个诅咒机, 然后O(n²)BFS去判断. 构成一个有向图, tarjan缩点, 然后就是求DAG的最长路.. ------------------------------------- ...

  7. BZOJ 1191: [HNOI2006]超级英雄Hero 匈牙利算法

    1191: [HNOI2006]超级英雄Hero Time Limit: 2 Sec  Memory Limit: 256 MBSubmit: xxx  Solved: 2xx 题目连接 http:/ ...

  8. bzoj 3752: Hack 预处理+暴力dfs

    题目大意: 定义字符串的hash值\(h = \sum_{i=0}^{n-1}p^{n-i-1}s_i\) 现在给定K个长度不超过L的字符串S,对于每个字符串S,求字典序最小长度不超过L的字符串T使得 ...

  9. Bzoj 1085: [SCOI2005]骑士精神 (dfs)

    Bzoj 1085: [SCOI2005]骑士精神 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1085 dfs + 剪枝. 剪枝方法: ...

随机推荐

  1. AutoCAD如何移动零件和缩放零件图

    如下图所示,我想要把这个零件放大并移动到图纸的中央,先全部选中这个零件,方法是在左上角点一下,然后拖出一个矩形包围整个零件   然后点击右侧的缩放命令,底部的命令栏变成指定基点的时候,在这个图纸的右上 ...

  2. openLayers加载高德地图

    之前用openlayers对高德,百度,腾讯,bing,supermap,天地图,arcgis,google等地图进行了对接,今天简单介绍一下openlayers+高德: 在Openlayers.La ...

  3. linux挂载硬盘

    最近有个生产机由于缓存问题,硬盘不太够用,所以就加载了一块硬盘,下面把挂载硬盘的过程记录下,供大家参考,有问题欢迎留言! fdisk –l ------------------------------ ...

  4. GetDlgItem() 出现错误

    写MFC程序ASSERT(IsWindow(pTemp->m_hWnd))报错 CRect rect; CWnd *pWnd = GetDlgItem(IDC_picture);//IDC_pi ...

  5. js 原生方法获取所有兄弟节点

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  6. css样式控制元素固定在底部

    回复固定在底部:css样式用到了 box-sizing属性 box-sizing:border-box; -moz-box-sizing:border-box; /* Firefox */ -webk ...

  7. jdbcTemplaate queryForObject的两个易混淆的方法

    JdbcTemplate中有两个可能会混淆的queryForObject方法: 1.    Object queryForObject(String sql, Object[] args, Class ...

  8. FreeRTOS在神舟IV号开发板的应用demo

    下面一个可以直接编译运行的例子,FreeRTOS的版本是V7.1.0,芯片是STM32F107VCT6,使用的开发环境是Keil uVision5. 这里例子创建了四个任务,每个任务控制一个LED的亮 ...

  9. 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响应头解决跨域请求

  10. iis出现HTTP 错误 403.14 - Forbidden Web问题

    找到"目录浏览",并"应用"