제출 #1014165

#제출 시각아이디문제언어결과실행 시간메모리
10141650npata카니발 티켓 (IOI20_tickets)C++17
39 / 100
3104 ms2097152 KiB
#include "tickets.h"
#include<bits/stdc++.h>

using namespace std;

#define vec vector
#define int long long

const int INF = 1e17;


long long find_maximum(int32_t k, vec<vec<int32_t>> x) {
	int n = x.size();
	int m = x[0].size();

	vec<vec<pair<int, int>>> dp(n+1, vec<pair<int, int>>(k*n+1, {-INF, -1}));
	dp[0][0] = {0, -1};
	vec<vec<int32_t>> ans(n, vec<int32_t>(m, -1));

	for(int i = 0; i<n; i++) {
		int cur = 0;
		for(int j = m-1; j >= m-k; j--) {
			cur += x[i][j];
		}
		for(int j = 0; j<=k; j++) {
			for(int l = 0; l<k*n+1; l++) {
				if(l+j >= k*n+1) {
					continue;
				}
				if(dp[i][l].first+cur > dp[i+1][l+j].first) {
					dp[i+1][l+j] = {dp[i][l].first+cur, j};
				}
			}

			cur -= x[i][j];
			cur -= x[i][m-k+j];
		}
	}

	vec<pair<vec<int>, int>> mxs(n);
	vec<pair<vec<int>, int>> mns(n);

	vec<int> mn_cnt_seq(n);
	int cur = k*n/2;
	for(int i = n; i>0; i--) {
		mn_cnt_seq[i-1] = dp[i][cur].second;
		assert(dp[i][cur].second != -1);
		cur -= dp[i][cur].second;
		assert(cur >= 0);
	}

	//cerr << "MN_CNT_SEQ: ";
	//for(int i = 0; i<n; i++) {
		//cerr << mn_cnt_seq[i] << ' ';
	//}
	//cerr << '\n';

	for(int i = 0; i<n; i++) {
		mns[i] = {{}, i};
		for(int j = 0; j<mn_cnt_seq[i]; j++) {
			mns[i].first.push_back(j);
		}
		mxs[i] = {{}, i};
		for(int j = m-1; j>=m-(k-mn_cnt_seq[i]); j--) {
			mxs[i].first.push_back(j);
		}
	}

	for(int i = 0; i<k; i++) {
		sort(mns.begin(), mns.end(), [](auto& el1, auto& el2) { return el1.first.size() > el2.first.size(); });
		sort(mxs.begin(), mxs.end(), [](auto& el1, auto& el2) { return el1.first.size() > el2.first.size(); });
		set<int> used;
		for(int j = 0; j<n/2; j++) {
			used.insert(mns[j].second);
			int l = mns[j].first.back();
			mns[j].first.pop_back();
			ans[mns[j].second][l] = i;
		}
		int cntmx = 0;
		for(int j = 0; j<n; j++) {
			if(used.count(mxs[j].second)) continue;
			assert(mxs[j].first.size() > 0);
			int l = mxs[j].first.back();
			mxs[j].first.pop_back();
			ans[mxs[j].second][l] = i;
		}
	}

	allocate_tickets(ans);

	return dp[n][k*n/2].first;
}

컴파일 시 표준 에러 (stderr) 메시지

tickets.cpp: In function 'long long int find_maximum(int32_t, std::vector<std::vector<int> >)':
tickets.cpp:79:7: warning: unused variable 'cntmx' [-Wunused-variable]
   79 |   int cntmx = 0;
      |       ^~~~~
#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...