记录编号 314908 评测结果 AAAAAAAAAA
题目名称 书的复制 最终得分 100
用户昵称 Gravatar小e 是否通过 通过
代码语言 C++ 运行时间 0.003 s
提交时间 2016-10-04 14:11:24 内存使用 0.32 MiB
显示代码纯文本
#include "cstdio"
#include "cstring"
#include "iostream"
using namespace std;

int m, k, book[110];
int sum[110], s[110], t[110];

inline bool Check(const int& mid)
{
	memset(s, 0, sizeof(s));
	memset(t, 0, sizeof(t));
	int pos = m + 1;
	for(int i = k; i; i--){
		int j = pos - 1;
		if (sum[pos-1]-sum[j-1] > mid){
//			puts("judge");
			return 0;
		}
		for(j = pos - 1; j && sum[pos-1]-sum[j-1] <= mid; j--);
		s[i] = ++j; t[i] = pos - 1; pos = j;
//		printf("s[%d]:%d t[%d]:%d\n", i, s[i], i, t[i]);
		if(s[i] == 1 && i != 1) return 1;
	}
	if(s[1] != 1) return 0;
	return 1;
}

int main()
{
	freopen("books.in", "r", stdin); freopen("books.out", "w", stdout);
	scanf("%d%d", &m, &k);
	for(int i = 1; i <= m; i++){
		scanf("%d", &book[i]);
		sum[i] = sum[i-1] + book[i];
	}
	int l = 0, r = sum[m], mid;
	while(l <= r){
		mid = (l + r) >> 1;
//		printf("l:%d r:%d mid:%d\n", l, r, mid);
		if(Check(mid)) r = mid - 1;
		else l = mid + 1;
	}
	if(Check(l)){
//		printf("ans:%d\n", l); 
		for(int i = 1; i <= k; i++) printf("%d %d\n", s[i], t[i]);
	}
	else if(Check(r)){
//		printf("ans:%d\n", r); 
		for(int i = 1; i <= k; i++) printf("%d %d\n", s[i], t[i]);
	}

	return 0;
}
/*
book.in
9 3
1 2 3 4 5 6 7 8 9

book.out
1 5
6 7
8 9

*/
/*
10 6
11 3 2 5 10 11 11 5 5 6 

ans: 16
*/