結果
問題 | No.691 E869120 and Constructing Array 5 |
ユーザー | e869120 |
提出日時 | 2018-05-17 21:28:44 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 278 ms / 1,000 ms |
コード長 | 2,158 bytes |
コンパイル時間 | 1,127 ms |
コンパイル使用メモリ | 93,264 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-28 14:48:06 |
合計ジャッジ時間 | 9,841 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 276 ms
6,816 KB |
testcase_01 | AC | 278 ms
6,944 KB |
testcase_02 | AC | 270 ms
6,944 KB |
testcase_03 | AC | 259 ms
6,940 KB |
testcase_04 | AC | 257 ms
6,944 KB |
testcase_05 | AC | 258 ms
6,940 KB |
testcase_06 | AC | 253 ms
6,944 KB |
testcase_07 | AC | 253 ms
6,940 KB |
testcase_08 | AC | 265 ms
6,944 KB |
testcase_09 | AC | 248 ms
6,940 KB |
testcase_10 | AC | 260 ms
6,940 KB |
testcase_11 | AC | 256 ms
6,944 KB |
testcase_12 | AC | 264 ms
6,940 KB |
testcase_13 | AC | 258 ms
6,944 KB |
testcase_14 | AC | 256 ms
6,940 KB |
testcase_15 | AC | 258 ms
6,944 KB |
testcase_16 | AC | 261 ms
6,940 KB |
testcase_17 | AC | 253 ms
6,944 KB |
testcase_18 | AC | 258 ms
6,944 KB |
testcase_19 | AC | 253 ms
6,944 KB |
testcase_20 | AC | 262 ms
6,944 KB |
testcase_21 | AC | 247 ms
6,944 KB |
testcase_22 | AC | 267 ms
6,944 KB |
testcase_23 | AC | 260 ms
6,944 KB |
testcase_24 | AC | 253 ms
6,940 KB |
testcase_25 | AC | 254 ms
6,940 KB |
testcase_26 | AC | 246 ms
6,944 KB |
testcase_27 | AC | 3 ms
6,940 KB |
ソースコード
#include <iostream> #include <vector> #include <algorithm> #include <cmath> #include <ctime> using namespace std; struct State { long double v; vector<int>t; }; bool operator<(const State &a1, const State &a2) { if (a1.v < a2.v) return true; return false; } int Rand() { return (1 << 20)*(rand() % 1024) + (1 << 10)*(rand() % 1024) + (rand() % 1024); } vector<int>concatenate(vector<int>A1, vector<int>A2) { vector<int>I; for (int i = 0; i < A1.size(); i++) I.push_back(A1[i]); for (int i = 0; i < A2.size(); i++) I.push_back(A2[i]); return I; } vector<int>solve(long double T) { vector<State>F; int G1 = T / 8; while (F.size() <= 100) { int Y = Rand() % (G1*G1); long double I = (T / 8) - sqrtl(1.0L*Y); long double J = I*I; int K1 = J, K2 = K1 + 1; long double L1 = sqrtl(1.0L*Y) + sqrtl(1.0L*K1); if (abs(T / 8 - L1) <= 1.0e-4) { F.push_back(State{ L1, vector<int>{Y, K1} }); } long double L2 = sqrtl(1.0L*Y) + sqrtl(1.0L*K2); if (abs(T / 8 - L2) <= 1.0e-4) { F.push_back(State{ L2, vector<int>{Y, K2} }); } } sort(F.begin(), F.end()); long double EPS1 = T / 8, EPS = 1e-4; for (int i = 0; i < 3; i++) { vector<State>G; EPS1 *= 2.0L; EPS *= 0.01L; for (int j = 0; j < F.size(); j++) { long double R1 = (EPS1 - F[j].v); int pos1 = lower_bound(F.begin(), F.end(), State{ R1,vector<int>{} }) - F.begin(); if (pos1 >= 1) { long double Y = F[pos1 - 1].v + F[j].v; if (abs(Y - EPS1) <= EPS) G.push_back(State{ Y,concatenate(F[pos1 - 1].t,F[j].t) }); } if (pos1 < F.size()) { long double Y = F[pos1].v + F[j].v; if (abs(Y - EPS1) <= EPS) G.push_back(State{ Y,concatenate(F[pos1].t,F[j].t) }); } } F = G; sort(F.begin(), F.end()); } if (F.size() == 0) return vector<int>{}; return F[0].t; } int main() { srand((unsigned)time(NULL)); int Q; cin >> Q; for (int i = 1; i <= Q; i++) { long double P; cin >> P; vector<int>Z; while (true) { Z = solve(P); if (Z.size() >= 1) break; } long double E = 0; cout << Z.size(); for (int j = 0; j < Z.size(); j++) { cout << " " << Z[j]; E += sqrtl(1.0L*Z[j]); }cout << endl; //printf("score = %.13Lf\n", abs(P - E)); } return 0; }