题意:

有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. multiDex分包时指定主dex的class列表

    在gradle中我们使用了如下代码可以将指定类型分配到主dex中: afterEvaluate { tasks.matching { it.name.startsWith('dex') }.each ...

  2. 集齐所有机制的按键控制LED驱动

    内核版本:linux2.6.22.6 硬件平台:JZ2440 驱动源码 final_key.c : #include <linux/module.h> #include <linux ...

  3. SmokePing介绍

    一.SmokePing是什么? smokeping是rrdtool的作者Tobi Oetiker的作品,用Perl语言写的,主要是监视网络性能,所以它在图形显示方面有很大优势,也是一个很有特点的ope ...

  4. 获取APP和设备相关信息

    APP NAME: [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleDisplayName"] APP ...

  5. mysql数据库数据(字段数过大)太多导入不了的解决方法

    mysql数据库数据(字段数过大)太多导入不了的决方法: 1.打开navicat 工具 2.在数据库上右键,执行右键菜单命令“命令列界面” 3.在打开的窗口中,运行set global max_all ...

  6. 执行hadoop自带的WordCount实例

    hadoop 自带的WordCount实例可以统计一批文本文件中各单词出现的次数.下面介绍如何执行WordCount实例. 1.启动hadoop [root@hadoop ~]# start-all. ...

  7. drf频率组件

    1.简介 控制访问频率的组件 2.使用 手写一个自定义频率组件 import time #频率限制 #自定义频率组件,return True则可以访问,return False则不能访问 class ...

  8. (转)Docker镜像构建上下文(Context)

    镜像构建上下文(Context) Docker在构建镜像时,如果注意,会看到 docker build 命令最后有一个 ... 表示当前目录,而 Dockerfile 就在当前目录,因此不少初学者以为 ...

  9. tf中的run()与eval()【转载】

    转自:https://blog.csdn.net/jiaoyangwm/article/details/79248535  1.eval() 其实就是tf.Tensor的Session.run() 的 ...

  10. linux iscsi挂载与卸载

    iscsiadm -m discovery -t sendtargets -p 192.168.4.245:3260 #扫描ISCSI Target 列出所有LUN iscsiadm -m node ...