安徽省2014年信息学竞赛试题(小学组)
题目描述 Description
聪明的卡卡西帮助工人师傅们解决了难题,师傅们为了表示感谢,特别赠送卡卡西一块三角形和一块长方形的两片小木块,并再三叮嘱卡卡西:“卡卡西,这可不是一般的小木块哦,在你迷路或走失时,它们会引领着你到达想去的地方!”“这太神奇了!谢谢!”,卡卡西如获至宝似的将这两块小木块收进包里,整晚都想着下一段奇妙的旅行。早上醒来之后,发现太阳已经高高的挂在空中,小朋友们都不见了,“不好,一定是起的太迟,没跟上大部队,这可怎么办呢?!”卡卡西懊悔的快要哭了,她赶紧站起来,收拾自己的书包,突然,包里的长方形木块和三角形木块飞了出来,组装在一起,形成一个大大的指示箭头,漂浮在空中,“对了,这个箭头一定是在告诉我,如何找到老师和同学”,卡卡西破涕为笑,满心欢喜的跟着箭头,向前方走去。走着走着,她来到了一个原木加工厂,看见老师和小朋友们都围绕在门口,一位工人叔叔正忧心忡忡的坐在地上,不停的抽着烟。卡卡西向前询问情况,这位叔叔说:“这个木材厂主要是把M 根原木切割成N 根长度一样的小段木头,切割时木头可以有剩余,老板让我计算可得到的这N 根小段木头的最大长度(其中原木和小段木头长度都是正整数),可是我不知道该怎么算,你们能帮帮我么?”卡卡西眼前一亮,上前轻轻拍了拍叔叔的肩膀,大声的说:“叔叔,这个你放心,我来帮你完成!”小朋友们,你们能计算出切割的小段木头的最大长度吗?
输入描述 Input Description
输入共两行。第一行M、N 用空格分开,分别表示原木数目和需要切割的小段木头数目。接下来一行共M个正整数,分别表示M根原木的长度(中间用空格隔开)。
输出描述 Output Description
切割后可得到的N 根小段木头的最大长度。
样例输入 Sample Input
3 7 4 10 26
样例输出 Sample Output
5
数据范围及提示 Data Size & Hint
样例说明:将3 根长度分别是4、10 和26 的原木切割成7 根长度一样的小段木头,这7 根长度一样的小段木头的最大长度是5。
数据范围:0≤M≤100000,0≤N≤100000
这道题使用二分查找,需要较高的编程技术,代码也是有点复杂,但只要认真思考,还是可以写出来的。
#include<iostream>
using namespace std;
long long n, m, a[100005];
bool check(int k) {
long long ans = 0;
for (int i = 1; i <= m; i++) {
ans += a[i] / k;
if (ans >= n) return true;
}
return false;
}
int main() {
cin >> m >> n;
for (int i = 1; i <= m; i++) {
cin >> a[i];
}
long long l = 1, r = 1e18;
while (l < r) {
long long mid = (l + r + 1) / 2;
if (check(mid)) {
l=mid;
}
else {
r=mid-1;
}
}
cout<<l;
return 0;
}