Submission #434122

#TimeUsernameProblemLanguageResultExecution timeMemory
434122krist7599555Jelly Flavours (IOI20_jelly)C++17
100 / 100
57 ms460 KiB
#include <algorithm>
#include <cassert>
#include <cstring>
#include <vector>
#include <numeric>
#include <iostream>
#include <tuple>
typedef std::vector<int> Vec;
#define rep(i,a,b) for(auto i = a; i != b; ++i)
 
auto ckmax = [](auto& a, const auto& b) { return b>a?a=b,1:0; };
auto ckmin = [](auto& a, const auto& b) { return b<a?a=b,1:0; };
 
const int MN = 2e3+10;
const int MV = 1e4+10;
 
struct Data {
	public:
		int jelly_count, remain_b_value;
		Data inc() {return {jelly_count+1, remain_b_value};}
		void buy(int cost) {++jelly_count, remain_b_value -= cost;}
		bool operator > (const Data& o) const {
      return std::tie(jelly_count, remain_b_value) > std::tie(o.jelly_count, o.remain_b_value);
    }
};
Data dp[MV];
 
int find_maximum_unique(int xn, int yn, std::vector<int> an, std::vector<int> bn)
{
	int N = an.size();
 
	std::vector<int> ord(N);
	std::iota(ord.begin(), ord.end(), 0);
	std::sort(ord.begin(), ord.end(), [&](int u, int v){return bn[u] < bn[v];});
 
  std::fill_n(dp, xn+1, Data({ 0, yn }));

	for (int i = 0; i != N; ++i) {
		int a = an[ord[i]]; // a = ? ? ? ? ?
		int b = bn[ord[i]]; // b = 1 2 3 4 5 
		for(int ai = 0; ai <= xn; ++ai) {
			if (dp[ai].remain_b_value >= b) dp[ai].buy(b);
      if (int nxa = ai + a; nxa <= xn) {
        const Data nx = dp[nxa].inc();
        if (nx > dp[ai]) {
          dp[ai] = nx;
        }
      }
		}
	}
	return dp[0].jelly_count;
}

inline int input() {
  int i; std::cin >> i; return i;
}

#ifdef KRIST_LOCAL

int main() {
  assert(4 == find_maximum_unique(6, 12, Vec({5, 1, 5, 6, 3}), Vec({3, 5, 4, 6, 7})));
  puts("pass");
  // using namespace std;
  // cin.sync_with_stdio(0);
  // int n = input();
  // int x = input();
  // int y = input();
  // std::vector<int> xn(n);
  // std::vector<int> yn(n);
  // rep(i, 0, n) xn[i] = input();
  // rep(i, 0, n) yn[i] = input();
  // cout << find_maximum_unique(x, y, xn, yn);
}

#endif
#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...