swustoj(木材加工(0436))
2017-04-14 16:39
288 查看
木材厂有一些原木,现在想把这些原木切割成一些长度相同的小段木头(并不是所有原木都一定要用完,可以有剩余),需要得到的小段的数目是给定的。当然,我们希望得到的小段越长越好,你的任务是计算能够得到的小段木头的最大长度。木头长度的单位是cm。原木的长度都是正整数,我们要求切割得到的小段木头的长度也是正整数。
Description
第一行是两个正整数N和K(1 ≤ N ≤ 10000,1 ≤ K ≤ 10000),N是原木的数目,K是需要得到的小段的数目。
接下来的N行,每行有一个1到10000之间的正整数,表示一根原木的长度。
Input
输出能够切割得到的小段的最大长度。如果连1cm长的小段都切不出来,输出”0”。
Output
Sample Input
Description
第一行是两个正整数N和K(1 ≤ N ≤ 10000,1 ≤ K ≤ 10000),N是原木的数目,K是需要得到的小段的数目。
接下来的N行,每行有一个1到10000之间的正整数,表示一根原木的长度。
Input
输出能够切割得到的小段的最大长度。如果连1cm长的小段都切不出来,输出”0”。
Output
3 7 232 124 456 |
114#include<stdio.h> #include<iostream> using namespace std; int a[10005]; int n, m; int ans; int findx(int x) { int sum = 0; for (int i = 0; i < n; i++) { sum += (a[i] / x); } return sum; } void find(int l, int r) { int mid = (l + r) / 2; int t = findx(mid); if (l == r) { if (t >= m) ans = mid;//l==r有可能不满足条件 return; } if (t >= m) { ans = mid; find(mid + 1, r); } else { ans = mid; find(l, mid - 1); } } int main() { int i, sum, count, j; while (cin >> n >> m) { sum = 0; for (i = 0; i < n; i++) { cin >> a[i]; sum += a[i]; } sum /= m;//缩小范围 if (sum == 0)cout << "0" << endl; else { find(1, sum); cout << ans << endl; } } return 0; } |
相关文章推荐
- swustoj木材加工(0436)
- swust.oj.319
- swust.oj.1015
- 洛谷——P2440 木材加工
- swustoj dearway's problem(0240)
- codevs 3297 木材加工(裸二分)
- 【二分】coj 1048 木材加工(加强版)
- swustoj Locker doors(0480)
- 【swust.oj_1088】我们的征途是星辰大海
- openjudge 木材加工
- [博弈游戏]Euclid's Game(0099)-SWUST_OJ
- 木材加工
- [Swust OJ 166]--方程的解数(hash法)
- [Swust OJ 666]--初来乍到(题号都这么溜~~,递归,找规律)
- [Swust OJ 465]--吴奶奶买鱼(0-1背包+dfs)
- [Swust OJ 838]--最优价值(0-1背包+数学)
- [Swust OJ 589]--吃西瓜(三维矩阵压缩)
- [Swust OJ 403]--集合删数
- [Swust OJ 385]--自动写诗
- C语言BFS(5)___TT与魔法师(swust oj 2464)