結果
| 問題 | No.286 Modulo Discount Store |
| コンテスト | |
| ユーザー |
koyopro
|
| 提出日時 | 2015-10-09 23:05:22 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0 + boost 1.89.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,349 bytes |
| 記録 | |
| コンパイル時間 | 1,376 ms |
| コンパイル使用メモリ | 163,820 KB |
| 実行使用メモリ | 5,376 KB |
| 最終ジャッジ日時 | 2024-07-20 04:27:25 |
| 合計ジャッジ時間 | 2,447 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 4 WA * 36 |
ソースコード
#include "bits/stdc++.h"
using namespace std;
#define REP(i, n) for(int i=0; i<(n); i++)
#define RREP(i, n) for(int i=(n-1); i>=0; i--)
#define ALL(a) (a).begin(),(a).end()
int N,T;
signed main()
{
cin >> N;
vector<int> M(N);
REP(i,N) cin >> M[i];
// 全組み合わせ中いちばん余りが1000に近いものを
int maxi = 0;
int maxc = 0;
REP(i,1<<N) {
int sum = 0;
REP(j,N) {
if (i & 1<<j) sum += M[j];
}
sum %= 1000;
if (sum > maxc) {
maxc = sum;
maxi = i;
}
}
vector<int> K;
REP(i,N) {
if (maxi & 1<<i) K.push_back(M[i]);
}
sort(ALL(K));
// 1.iに含まれるやつを小さい順に買う
int sum = 0;
int price = 0;
for (auto&& k : K) {
price += max(0, k - (sum % 1000));
sum += k;
}
// 2.余りが0のやつを全部買う
REP(i,N) {
if (M[i] % 1000 == 0) {
int k = M[i];
price += max(0, k - (sum % 1000));
sum += k;
}
}
// 3.高い順に買う...?
sort(ALL(M));
RREP(i,N) {
if (M[i] % 1000 == 0) continue;
if (maxi & 1<<i) continue;
int k = M[i];
price += max(0, k - (sum % 1000));
sum += k;
}
cout << price << endl;
return 0;
}
koyopro