UVa 714 - Copying Books

題目:抄m本書,書的編號是連續的,現在要把這些書,按照連續編號分成k組,

            每本書有頁數,使得頁數和最大的那組總頁數最小,輸出方案。

分析:貪心、二分。利用二分頁數總和,貪心判斷最少需要的組數。

            輸出答案是從後向前組合即可,這裡也是貪心。

說明:900題了╮(╯▽╰)╭。

#include <stdio.h>

int page[505];

int part(long long length, int m)
{
	for (int i = m-1; i >= 0; -- i) {
		if (length < page[i]) {
			return m+1;
		}
	}
	long long sum = 0LL;
	int count = 1;
	for (int i = m-1; i >= 0; -- i) {
		if (sum + page[i] > length) {
			sum = 0;
			count ++;
		}
		sum += page[i];
	}
	return count;
}

void output(long long length, int m, int k)
{
	long long sum = page[m];
	int s = m-1;
	while (s >= k && sum + page[s] <= length) {
		sum += page[s --];
	}
	if (s >= 0) {
		output(length, s, k-1);
		printf(" / ");
	}
	for (int i = s+1; i < m; ++ i) {
		printf("%d ", page[i]);
	}
	printf("%d", page[m]);
}

int main()
{
    int n, m, k;
    scanf("%d", &n);
	while (n --) {
		scanf("%d%d", &m, &k);
		long long mid = 0LL, left = 0LL, right = 0LL; 
        for (int i = 0; i < m; ++ i) {
            scanf("%d", &page[i]);
            right = right + page[i];
        }
        // 二分
		while (left < right) {
			mid = left + (right-left)/2;
			if (part(mid, m) > k) {
				left = mid+1;
			}else {
				right = mid;
			}
		}
		
		output(left, m-1, k-1);
		puts("");
    }
    
    return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
easy-rsa-old-master.zip . ├── configure.ac ├── COPYING ├── COPYRIGHT.GPL ├── distro │   ├── Makefile.am │   └── rpm │   ├── easy-rsa.spec.in │   └── Makefile.am ├── doc │   ├── Makefile.am │   ├── README-1.0 │   └── README-2.0 ├── easy-rsa │   ├── 1.0 │   │   ├── build-ca │   │   ├── build-dh │   │   ├── build-inter │   │   ├── build-key │   │   ├── build-key-pass │   │   ├── build-key-pkcs12 │   │   ├── build-key-server │   │   ├── build-req │   │   ├── build-req-pass │   │   ├── clean-all │   │   ├── list-crl │   │   ├── make-crl │   │   ├── openssl.cnf │   │   ├── revoke-crt │   │   ├── revoke-full │   │   ├── sign-req │   │   └── vars │   ├── 2.0 │   │   ├── build-ca │   │   ├── build-dh │   │   ├── build-inter │   │   ├── build-key │   │   ├── build-key-pass │   │   ├── build-key-pkcs12 │   │   ├── build-key-server │   │   ├── build-req │   │   ├── build-req-pass │   │   ├── clean-all │   │   ├── inherit-inter │   │   ├── list-crl │   │   ├── openssl-0.9.6.cnf │   │   ├── openssl-0.9.8.cnf │   │   ├── openssl-1.0.0.cnf │   │   ├── pkitool │   │   ├── revoke-full │   │   ├── sign-req │   │   ├── vars │   │   └── whichopensslcnf │   └── Windows │   ├── build-ca.bat │   ├── build-ca-pass.bat │   ├── build-dh.bat │   ├── build-key.bat │   ├── build-key-pass.bat │   ├── build-key-pkcs12.bat │   ├── build-key-server.bat │   ├── build-key-server-pass.bat │   ├── clean-all.bat │   ├── index.txt.start │   ├── init-config.bat │   ├── README.txt │   ├── revoke-full.bat │   ├── serial.start │   └── vars.bat.sample └── Makefile.am

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值