Submission #1288732

#TimeUsernameProblemLanguageResultExecution timeMemory
1288732ecen30선물 (IOI25_souvenirs)C++20
0 / 100
13 ms388 KiB
//testing AI CODe #include "souvenirs.h" #include <vector> #include <algorithm> using namespace std; void buy_souvenirs(int N, long long P0) { vector<long long> prices(N); prices[0] = P0; vector<int> bought(N, 0); // Strategy: Discover prices by binary search, then buy exact amounts needed // Step 1: Find P[N-1] (the cheapest item) long long lo = 1, hi = P0 - 1; while (lo < hi) { long long mid = (lo + hi) / 2; auto result = transaction(mid); // Update bought counts for (int item : result.first) { bought[item]++; } if (result.first.empty() || result.first.back() < N - 1) { // Didn't buy item N-1, so mid < P[N-1] lo = mid + 1; } else { // Bought item N-1, so mid >= P[N-1] hi = mid; } } prices[N - 1] = lo; // Step 2: Find other prices by testing specific amounts // Key insight: If we pay exactly sum of prices from i to N-1, // we buy exactly items i through N-1 for (int i = N - 2; i >= 1; i--) { // Binary search for P[i] lo = prices[N - 1]; hi = (i == 1) ? (P0 - 1) : prices[i - 1] - 1; while (lo < hi) { long long mid = (lo + hi + 1) / 2; // Test: pay mid + (sum of prices from i+1 to N-1) long long test_amount = mid; for (int j = i + 1; j < N; j++) { test_amount += prices[j]; } // Make sure test_amount is valid if (test_amount >= P0) { // Just test mid alone auto result = transaction(mid); for (int item : result.first) { bought[item]++; } // Check if item i was bought bool bought_i = false; for (int item : result.first) { if (item == i) { bought_i = true; break; } } if (bought_i) { lo = mid; } else { hi = mid - 1; } } else { auto result = transaction(test_amount); for (int item : result.first) { bought[item]++; } // If we bought item i, then mid >= P[i] bool bought_i = false; for (int item : result.first) { if (item == i) { bought_i = true; break; } } if (bought_i) { // We can deduce the price from what was bought long long total_spent = test_amount - result.second; long long known_sum = 0; for (int item : result.first) { if (item > i) { known_sum += prices[item]; } } prices[i] = total_spent - known_sum; break; } else { hi = mid - 1; } } } if (prices[i] == 0) { prices[i] = lo; } } // Step 3: Buy remaining souvenirs to meet quotas // We need exactly i souvenirs of type i for (int i = 1; i < N; i++) { while (bought[i] < i) { auto result = transaction(prices[i]); for (int item : result.first) { bought[item]++; } } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...