uva 10163 Storage Keepers
题意:
有n个仓库,m个人,一个仓库只能由一个人托管,每个人可以托管多个仓库。
每个人有一个能力值a,如果说他托管了k个仓库,那么这些仓库的安全值都是a/k。
雇佣一个人的花费也是a。
如果一个仓库没有被人托管,那么这个仓库的安全值为0。
总安全值定义为所有仓库安全值的最小值。
现在给出人和仓库的信息,在总安全值最大的情况下,求出最小的花费。
思路:
两次dp。
dp[i][j]表示前i个人托管前j个仓库的最大的总安全度
dp[i][j] = max(dp[i-1][j],a[i]/j)
dp[i][j] = max(dp[i][j],max(min(dp[i-1][k],a[i]/k))) ,k从1到j-1。
第一个转移,前i-1个人托管了j个仓库,也可能第i个人托管了j个仓库。
第二个转移,就是前i-1个人托管了j-k个仓库,第i个人托管了k个仓库。
这样求出了最大的安全值min。
第二次dp求的是花费的最小的费用,转移与上面的类似,但是每一次都要加一个当前的总安全值大于等于min才能转移的条件。
代码:
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
const int N = ,M = ;
const int inf = 0x3f3f3f3f;
int dp[N][M],dq[N][M];
int a[N];
int main()
{
int n,m;
while (scanf("%d%d",&n,&m) != EOF && n + m)
{
for (int i = ;i <= m;i++) scanf("%d",&a[i]);
memset(dq,inf,sizeof(dq));
memset(dp,,sizeof(dp));
for (int i = ;i <= n;i++)
{
dp[][i] = a[] / i;
}
for (int i = ;i <= m;i++)
{
for (int j = ;j <= n;j++)
{
dp[i][j] = max(dp[i-][j],a[i] / j);
int tmp = ;
for (int k = ;k < j;k++)
{
int t = min(dp[i-][j-k],a[i]/k);
tmp = max(tmp,t);
}
dp[i][j] = max(tmp,dp[i][j]);
}
}
int mn = dp[m][n];
for (int i = ;i <= n;i++)
{
if (a[] / i >= mn)
{
dq[][i] = a[];
}
}
//puts("");
for (int i = ;i <= m;i++)
{
for (int j = ;j <= n;j++)
{
if (dp[i-][j] >= mn) dq[i][j] = min(dq[i-][j],dq[i][j]);
if (a[i] / j >= mn) dq[i][j] = min(a[i],dq[i][j]);
for (int k = ;k < j;k++)
{
int t = min(dp[i-][j-k],a[i]/k);
if (t >= mn)
{
dq[i][j] = min(dq[i-][j-k] + a[i],dq[i][j]);
}
}
}
}
if (mn == )
{
puts("0 0");
}
else
{
printf("%d %d\n",mn,dq[m][n]);
}
}
return ;
}
/*
2 1
7
1 2
10 9
2 5
10 8 6 4 1 5 4 1 1 1 1 0 0
*/
uva 10163 Storage Keepers的更多相关文章
- UVA 10163 Storage Keepers(两次DP)
UVA 10163 Storage Keepers(两次DP) http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Ite ...
- DP(两次) UVA 10163 Storage Keepers
题目传送门 /* 题意:(我懒得写,照搬网上的)有n个仓库,m个人看管.一个仓库只能由一个人来看管,一个人可以看管多个仓库. 每个人有一个能力值pi,如果他看管k个仓库,那么所看管的每个仓库的安全值为 ...
- uva 10163 - Storage Keepers(01背包)
题目链接:10163 - Storage Keepers 题目大意:给出m为仓库的数量, 给出n为有守夜人的数量, 然后给出n个数值,为对应守夜人应付的酬劳,每个守夜人的能力与他需要的酬劳是相等的,并 ...
- UVA 10163 Storage Keepers(dp + 背包)
Problem C.Storage Keepers Background Randy Company has N (1<=N<=100) storages. Company wants ...
- UVa 10163 Storage Keepers (二分 + DP)
题意:有n个仓库,m个管理员,每个管理员有一个能力值P,每个仓库只能由一个管理员看管,但是每个管理员可以看管k个仓库(但是这个仓库分配到的安全值只有p/k,k=0,1,...),雇用的管理员的工资即为 ...
- UVA 10163 - Storage Keepers(dp)
本文出自 http://blog.csdn.net/shuangde800 题目链接: 点击打开链接 题意 有n个仓库,让m个人来看管.一个仓库只能由一个人来看管,一个人可以看管多个仓库. 每个人 ...
- UVA 10163 十六 Storage Keepers
十六 Storage Keepers Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit ...
- 【Uva 10163】Storage Keepers
[Link]: [Description] 你有n(n≤100)个相同的仓库.有m(m≤30)个人应聘守卫,第i个应聘者的能力值 为Pi(1≤Pi≤1000).每个仓库只能有一个守卫,但一个守卫可以看 ...
- UVA-10163 Storage Keepers DP
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
随机推荐
- Matlab 快捷键 命令
1. 在命令窗口(Command Window)中: 1) [上.下键]――切换到之前.之后的命令,可以重复按多次来达到你想要的命令 2) clc――清除命令窗口显示的语句,此命令并不清空当前工作区的 ...
- python之文件操作的几种模式总结
文件操作的几种模式: "w" #write ,清空写,生成一个新的文件,写入内容,覆盖原文件"w+" ...
- java 线程 (二) 线程池
package cn.sasa.demo2; import java.util.concurrent.ExecutorService; import java.util.concurrent.Exec ...
- (4.29)sql server中有关于GO的坑
本问题基于上海sql server dba技术群提问分析总结而成: 群友问题: 就是一台服务器有数据库A,但没有数据库B(A和B有相同得表),我把B数据库的建表语句执行了在use A环境下了,为什么A ...
- MySQL复制异常大扫盲:快速溯源与排查错误全解
MySQL复制异常大扫盲:快速溯源与排查错误全解https://mp.weixin.qq.com/s/0Ic8BnUokyOj7m1YOrk1tA 作者介绍王松磊,现任职于UCloud,从事MySQL ...
- 导出Excel(导出一个模版)
有时,客户需要一个标准的模板来填东西,然后在导入 这时可以弄好excel模板,供导出 /** * 导出excel模板文件 * @param request * @param response * @r ...
- vuex操作
import Vuex from 'vuex' //引入Vue.use(Vuex) //加载到Vue中//创建一个数据存储对象var store=new Vuex.Store({ //state可以当 ...
- sap 类的左侧导航栏
- solr创建业务域以及指定中文分析器IK
第一步:把中文分析器添加到工程中. 1.把IKAnalyzer2012FF_u1.jar添加到solr工程的lib目录下 2.把扩展词典.配置文件放到solr工程的WEB-INF/classes目录下 ...
- js图的数据结构处理----邻链表,广度优先搜索,最小路径,深度优先搜索,探索时间拓扑
//邻居连表 //先加入各顶点,然后加入边 //队列 var Queue = (function(){ var item = new WeakMap(); class Queue{ construct ...