結果
| 問題 |
No.5018 Let's Make a Best-seller Book
|
| コンテスト | |
| ユーザー |
Shun_PI
|
| 提出日時 | 2023-10-01 14:14:53 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 34 ms / 400 ms |
| コード長 | 3,115 bytes |
| コンパイル時間 | 2,870 ms |
| コンパイル使用メモリ | 194,456 KB |
| 実行使用メモリ | 24,372 KB |
| スコア | 1,323 |
| 平均クエリ数 | 52.00 |
| 最終ジャッジ日時 | 2023-10-01 14:15:04 |
| 合計ジャッジ時間 | 11,013 ms |
|
ジャッジサーバーID (参考情報) |
judge15 / judge11 |
| 純コード判定しない問題か言語 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 100 |
ソースコード
#pragma GCC target("avx2")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")
#include <bits/stdc++.h>
using namespace std;
using lint = long long int;
using P = pair<int, int>;
using PL = pair<lint, lint>;
#define FOR(i, begin, end) for(int i=(begin),i##_end_=(end);i<i##_end_;i++)
#define IFOR(i, begin, end) for(int i=(end)-1,i##_begin_=(begin);i>=i##_begin_;i--)
#define REP(i, n) FOR(i,0,n)
#define IREP(i, n) IFOR(i,0,n)
#define ALL(a) (a).begin(),(a).end()
constexpr int MOD = 1000000007;
constexpr lint B1 = 1532834020;
constexpr lint M1 = 2147482409;
constexpr lint B2 = 1388622299;
constexpr lint M2 = 2147478017;
constexpr int INF = 2147483647;
void yes(bool expr) {cout << (expr ? "Yes" : "No") << "\n";}
template<class T>void chmax(T &a, const T &b) { if (a<b) a=b; }
template<class T>void chmin(T &a, const T &b) { if (b<a) a=b; }
constexpr bool DEBUG = false;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int T, N, Money;
cin >> T >> N;
if(!DEBUG) cin >> Money;
else Money = 2000000;
vector<int> R(N), P(N);
vector<double> D(N);
if(DEBUG) REP(i, N) cin >> D[i];
vector<vector<double>> Z(T, vector<double>(N));
if(DEBUG) REP(i, T) REP(j, N) cin >> Z[i][j];
vector<double> weight(N);
REP(i, N) weight[i] = 1.0 / N;
int score = 0;
REP(t, T) {
/*
cerr << t << endl;
cerr << Money << endl;
REP(i, N) cerr << R[i] << " ";
cerr << endl;
REP(i, N) cerr << P[i] << " ";
cerr << endl;
*/
int mode = 1;
vector<int> L(N);
int x = 1;
// 行動を決める
int MODE_CHANGE_TURN = 99;
if(t < MODE_CHANGE_TURN) {
REP(i, N) L[i] = max(0, 3 - R[i]);
} else {
REP(i, N) if(P[i] < 0) weight[i] = 0;
double weight_sum = accumulate(ALL(weight), 0.0);
REP(i, N) weight[i] /= weight_sum;
REP(i, N) L[i] = Money / 500 * weight[i];
/*
if(t > MODE_CHANGE_TURN && Money > 4000000) {
mode = 2;
x = 4;
}
*/
}
REP(i, N) assert(L[i] >= 0);
cout << mode << " ";
if(mode == 1) {
REP(i, N) cout << L[i] << (i!=N-1 ? " " : "");
REP(i, N) R[i] += L[i];
REP(i, N) Money -= 500 * L[i];
} else {
cout << x;
Money -= 500000 * pow(2, x-1);
}
cout << "\n";
cout.flush();
vector<int> S(N);
if(!DEBUG) {
cin >> Money;
if(Money == -1) {
cerr << "Money is -1" << endl;
return 0;
}
REP(i, N) cin >> S[i];
}
//結果の受け取り
REP(i, N) {
int s = S[i];
if(DEBUG) s = min(R[i], (int)floor(sqrt(R[i]) * pow(1.05, P[i]) * D[i] * Z[t][i]));
score += s;
Money += 1000 * s;
//double estimate_D = s / sqrt(R[i]) / pow(1.05, P[i]);
//if(estimate_D > 1.0) weight[i] *= 1.0;
//else weight[i] /= 1.0;
if(R[i] > 0) {
if(s >= 0.3 * R[i]) P[i] = min(60, P[i] + 1);
else if(s <= 0.1 * R[i]) P[i] = max(-60, P[i] - 1);
}
R[i] -= s;
}
if(!DEBUG) {
REP(i, N) cin >> P[i];
REP(i, N) cin >> R[i];
}
}
cerr << score/100 << endl;
}
Shun_PI