結果
| 問題 |
No.67 よくある棒を切る問題 (1)
|
| コンテスト | |
| ユーザー |
bal4u
|
| 提出日時 | 2019-09-07 14:06:39 |
| 言語 | C (gcc 13.3.0) |
| 結果 |
AC
|
| 実行時間 | 82 ms / 5,000 ms |
| コード長 | 1,229 bytes |
| コンパイル時間 | 235 ms |
| コンパイル使用メモリ | 26,496 KB |
| 実行使用メモリ | 8,484 KB |
| 最終ジャッジ日時 | 2025-03-03 11:26:34 |
| 合計ジャッジ時間 | 3,358 ms |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 30 |
ソースコード
// yukicoder: No.67 よくある棒を切る問題 (1)
// bal4u 2019.9.7
#include <stdio.h>
#include <stdlib.h>
typedef long long ll;
//// 高速入力
#if 1
#define gc() getchar_unlocked()
#else
#define gc() getchar()
#endif
int in() { // 非負整数の入力
int n = 0, c = gc();
do n = 10 * n + (c & 0xf); while ((c = gc()) >= '0');
return n;
}
ll inLL() {
ll n = 0; int c = gc();
do n = 10 * n + (c & 0xf); while ((c = gc()) >= '0');
return n;
}
#define EPS 1e-12
int N; ll K;
int L[200005];
inline static void chmax(ll *r, ll a) { if (*r < a) *r = a; }
ll cut(ll x) {
int i; ll s = 0;
for (i = 0; i < N; i++) s += L[i] / x;
return s;
}
double fine(double l, double r) {
int i, loop = 30; ll s; double m;
while (loop--) {
m = (l + r) / 2.0;
s = 0; for (i = 0; i < N; i++) s += (ll)((L[i]+EPS)/m + EPS);
if (s < K) r = m; else l = m;
}
return m;
}
int main()
{
int i; ll l, r, m, ma;
N = in();
ma = 0; for (i = 0; i < N; i++) {
L[i] = in(), chmax(&ma, L[i]);
}
K = inLL();
l = 1; r = ma+1;
while (l+1 < r) {
m = (l + r) >> 1;
if (cut(m) < K) r = m; else l = m;
}
if (cut(l) < K) r = l;
printf("%.12lf\n", fine((double)r-1, (double)r));
return 0;
}
bal4u