# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1252368 | anfi | 선물 (IOI25_souvenirs) | C++20 | 0 ms | 0 KiB |
#include"souvenirs.h"
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define fi first
#define se second
const long long inf = 1e9;
int n,p[105],cn[105];
int hitung(int s, int k){
s += k*(k-1)/2+k-1;
return s/k;
}
void find(int p0){
int ls = n;
int money = p0-1;
while(ls > 0){
auto [v, rm] = transaction(money);
int sum = money-rm;
for(int i : v) cn[i]++;
while(!v.empty() && v.back() >= ls){
sum -= p[v.back()]; v.pop_back();
}
if(v.empty()) break;
int i= v[0];
p[i] = sum;
ls = i;
money = hitung(sum, v.size())-1;
}
}
void buy_souvenirs(int N, long long p0){
memset(cn, 0, sizeof(cn));
memset(p, 0, sizeof(p));
p[0] = p0, n = N;
find(p0);
for(int i = 1; i < N; i++){
while(cn[i] < i){
transaction(p[i]);
cn[i]++;
}
}
}