求助。。
2026-07-24 16:58:49
发布于:云南
定义 n,k 为公司里的电缆数及所需电缆数
接下来 N 行为每根电缆的长度(1 米到 1000000 米之间),精确到小数点后两位,需要把电缆切成同样长的小段,使电缆数 = k,输出一个实数,表示满足要求的电缆长度
样例一:
输入
4 11
8.02
7.43
4.57
5.39
输出
2.00
n<=100000,k<=800000
修改过的代码
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000005;
int n, k;
double a[MAXN];
bool check(double mid) {
long long total = 0;
for (int i = 1; i <= n; i++) {
total += floor(a[i] / mid);
}
return total >= k;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> k;
double max_len = 0.0;
for (int i = 1; i <= n; i++) {
cin >> a[i];
if (a[i] > max_len)
max_len = a[i];
}
double l = 0.0, r = max_len;
while (r - l > 1e-12) {
double mid = (l + r) / 2;
if (check(mid)) {
l = mid;
} else {
r = mid;
}
}
cout << fixed << setprecision(2) << l << endl;
return 0;
}
全部评论 4
过了吗(
2026-07-24 来自 上海
0过了
2026-07-24 来自 云南
0改了啥
2026-07-24 来自 上海
0#include <bits/stdc++.h> using namespace std; const int MAXN = 100005; int wood[MAXN]; int n, k; bool check(int x) { if (x == 0) return true; long long total = 0; for (int i = 1; i <= n; ++i) { total += wood[i] / x; if (total >= k) return true; } return total >= k; } int main() { cin >> n >> k; int maxLen = 0; for (int i = 1; i <= n; ++i) { double x; cin >> x; wood[i] = x * 100; if (wood[i] > maxLen) maxLen = wood[i]; } int l = 1, r = maxLen; double ans = 0; while (l <= r) { int mid = l + (r - l) / 2; if (check(mid)) { ans = mid; l = mid + 1; } else { r = mid - 1; } } cout << setprecision(2) << fixed << ans / 100 << endl; return 0; }2026-07-24 来自 云南
0
for (int t = 1; t <= 100; t++)改为
while(r-l>1e-12)然后把
if (mid < 1e-8) break;删去
2026-07-24 来自 上海
0谢谢
2026-07-24 来自 云南
0你家二分是这么写的!?
2026-07-24 来自 上海
0woq,通过率多了10%,但还是没对。。90%对的
2026-07-24 来自 云南
0
坏了没看出来,能不能给一个错误的点
2026-07-24 来自 上海
0我这没测试点
2026-07-24 来自 云南
0这不是AIGO上的,锣鼓上也没有这题
2026-07-24 来自 云南
0哪里的我去写写(
2026-07-24 来自 上海
0
。。
2026-07-24 来自 云南
0























有帮助,赞一个