题意:

有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的更多相关文章

  1. UVA 10163 Storage Keepers(两次DP)

    UVA 10163 Storage Keepers(两次DP) http://uva.onlinejudge.org/index.php? option=com_onlinejudge&Ite ...

  2. DP(两次) UVA 10163 Storage Keepers

    题目传送门 /* 题意:(我懒得写,照搬网上的)有n个仓库,m个人看管.一个仓库只能由一个人来看管,一个人可以看管多个仓库. 每个人有一个能力值pi,如果他看管k个仓库,那么所看管的每个仓库的安全值为 ...

  3. uva 10163 - Storage Keepers(01背包)

    题目链接:10163 - Storage Keepers 题目大意:给出m为仓库的数量, 给出n为有守夜人的数量, 然后给出n个数值,为对应守夜人应付的酬劳,每个守夜人的能力与他需要的酬劳是相等的,并 ...

  4. UVA 10163 Storage Keepers(dp + 背包)

    Problem C.Storage Keepers  Background Randy Company has N (1<=N<=100) storages. Company wants ...

  5. UVa 10163 Storage Keepers (二分 + DP)

    题意:有n个仓库,m个管理员,每个管理员有一个能力值P,每个仓库只能由一个管理员看管,但是每个管理员可以看管k个仓库(但是这个仓库分配到的安全值只有p/k,k=0,1,...),雇用的管理员的工资即为 ...

  6. UVA 10163 - Storage Keepers(dp)

    本文出自   http://blog.csdn.net/shuangde800 题目链接: 点击打开链接 题意 有n个仓库,让m个人来看管.一个仓库只能由一个人来看管,一个人可以看管多个仓库. 每个人 ...

  7. UVA 10163 十六 Storage Keepers

    十六 Storage Keepers Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit ...

  8. 【Uva 10163】Storage Keepers

    [Link]: [Description] 你有n(n≤100)个相同的仓库.有m(m≤30)个人应聘守卫,第i个应聘者的能力值 为Pi(1≤Pi≤1000).每个仓库只能有一个守卫,但一个守卫可以看 ...

  9. UVA-10163 Storage Keepers DP

    题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...

随机推荐

  1. 【Python全栈-HTML】HTML入门

    HTML入门介绍 参考: https://www.bilibili.com/video/av21663728/?p=339 http://www.cnblogs.com/yuanchenqi/arti ...

  2. 关于byte[]与string、Image转换

    byte[]与string转换 参考网址:https://www.cnblogs.com/xskblog/p/6179689.html 1.使用System.Text.Encoding.Default ...

  3. C++ 方阵原地旋转90度

    不额外申请内存(另外的一个二维数组空间),将一个方阵(二维数组)原地旋转90度,主要的思路是,由外向内,一圈圈的进行旋转(就是依次进行交换),如下图所示,当这些圈圈都交换完了之后,就完成了原地旋转了. ...

  4. MyBatis的生命周期

    MyBatis的生命周期 所谓的生命周期就是第一个对象应该存活的时间,比如一些对象一次用完后就要关闭,使它们被Java虚拟机(JVM)销毁,以避免继续占用资源,所以我们会根据每一个组件的作用去确定其生 ...

  5. python基础教程 变量/输入输出/if判断

    python的运用越来越多.大数据经常被人谈及,数据从何而来?通过各个平台.app.网站数据的收集,分析,过滤,生成报告,这些都可以用python来处理,并且有很多成熟的库可以直接用了.那还不赶紧深入 ...

  6. NYOJ 方案数量

    1.递归求解(直接递归会超时,要用备忘录法) # include<iostream> # include<stdio.h> #include <map> using ...

  7. entry.define编程思路

    0.lua将文字传给场景脚本. 1.场景脚本将pattern.define文件中的PAT当作子弹(水泡弹,带颜色) 2.用户的问题作为客户端的请求,发送给服务器端 3.服务器端接受客户端的问题请求 4 ...

  8. vant - 头部 - header【Layout 布局】【Icon 图标】

    安装 npm i vant -S [main.js] import Vant from 'vant'; import 'vant/lib/index.css'; Vue.use(Vant); [ind ...

  9. 向数据库中添加数据,通过se16 不能添加,通过 代码可以添加的原因

    1:  在向数据库中添加数据时,通过客户端se16 准备对 数据表进行添加数据,提示如下: 找了以下原因,如下: https://www.baidu.com/link?url=3yRtAfY1_9XG ...

  10. spring——事务管理

    1.spring支持编程式事务管理和声明式事务管理. 编程式事务管理:编程式事务管理使用TransactionTemplate或者直接使用最底层的PlatformTransactionManager. ...