博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 714 Copying Books
阅读量:5091 次
发布时间:2019-06-13

本文共 1591 字,大约阅读时间需要 5 分钟。

UVA_714

    这个题目可以二分每个人分到的页数的上限,然后看能否安排成功并更新相应的max和min值,这样我们就得到了安排给每个人的页数的最大值的最小值。

    题目要求输出一个安排方案,并且要求标号越小的人工作量越小,这一点我们可以用贪心策略来保证,只要让标号大的人分配到的工作量尽可能大即可。但同时要求每个人至少要有一本书的工作量,这一点可以在分配工作量时用一个判断,即剩下的书至少要等于劳动力的数量。

#include
#include
#define MAXD 510 int K, M, a[MAXD], p[MAXD][MAXD], num[MAXD]; void solve() {
int i, j, k; long long int min, max, mid, ans; min = max = 0; for(i = 0; i < M; i ++) {
scanf("%d", &a[i]); if(a[i] > min) min = a[i]; max += a[i]; } -- min; for(;;) {
mid = (max + min) / 2; if(mid == min) break; ans = 0; for(j = k = 0; j < M; j ++) {
if(ans + a[j] > mid) {
++ k; if(k == K) break; ans = 0; } ans += a[j]; } if(j == M) max = mid; else min = mid; } ans = 0; memset(num, 0, sizeof(num)); for(i = M - 1, k = K - 1; i >= 0;i --) {
if(ans + a[i] > max || i == k - 1) {
-- k; ans = 0; } ans += a[i]; p[k][num[k] ++] = a[i]; } for(i = 0; i < K; i ++) {
for(j = num[i] - 1; j >= 0; j --) {
if(i != 0 || j != num[i] - 1) printf(" "); printf("%d", p[i][j]); } if(i != K - 1) printf(" /"); } printf("\n"); } int main() {
int t; scanf("%d", &t); while(t --) {
scanf("%d%d", &M, &K); solve(); } return 0; }

转载于:https://www.cnblogs.com/staginner/archive/2011/12/31/2309032.html

你可能感兴趣的文章
Animations介绍及实例
查看>>
判断请求是否为ajax请求
查看>>
【POJ2699】The Maximum Number of Strong Kings(网络流)
查看>>
spring boot配置跨域
查看>>
BZOJ 1996 合唱队(DP)
查看>>
进击吧!阶乘——大数乘法
查看>>
安卓学习资料推荐-25
查看>>
Mysql数据库备份和还原常用的命令
查看>>
关于退出当前页面在火狐的一些问题
查看>>
【项目实施】项目考核标准
查看>>
spring-aop AnnotationAwareAspectJAutoProxyCreator类
查看>>
经典入门_排序
查看>>
Redis Cluster高可用集群在线迁移操作记录【转】
查看>>
二、spring中装配bean
查看>>
VIM工具
查看>>
javascript闭包
查看>>
@Column标记持久化详细说明
查看>>
创建本地yum软件源,为本地Package安装Cloudera Manager、Cloudera Hadoop及Impala做准备...
查看>>
mysql8.0.13下载与安装图文教程
查看>>
站立会议08(冲刺2)
查看>>