제출 #1333668

#제출 시각아이디문제언어결과실행 시간메모리
1333668i271828IMO (EGOI25_imo)C++20
0 / 100
1 ms348 KiB
#include <bits/stdc++.h>
#define pii pair<int,int>
#define ll long long
using namespace std;

const int MAX=2e4+5;
const int MAXM=105;
const int INF=1<<30;

int N,M,K;
int A[MAX][MAXM];
bool dp[MAX][MAXM];
vector<int> dp0[MAX];
int ord[MAX];
int L[MAX];

bool cmp(pii a,pii b){
	if (a.first==b.first) return a.second>b.second;
	return a.first<b.first;
}

int main(){
	cin>>N>>M>>K;
	for (int i=0;i<N+5;i++) dp0[i].resize(M*K+5);
	for (int i=0;i<N;i++) for (int j=0;j<M;j++) cin>>A[i][j];
	vector<pii> vct(N); // {v,i}
	for (int i=0;i<N;i++) vct[i]={0,i};
	for (int i=0;i<N;i++) for (int j=0;j<M;j++) vct[i].first+=A[i][j];
	sort(vct.begin(),vct.end(),cmp);
	for (int i=0;i<N;i++) ord[i]=vct[i].second;
	for (int i=0;i<N;i++){
		int l=vct[i].first;
		L[i]=l;
		int r=(i==N-1?M*K:vct[i+1].first);
		for (int x=l;x<=r;x++) for (int k=0;k<=M;k++) dp[x][k]=0;
		dp[l][0]=1;
		for (int j=0;j<M;j++) for (int k=M;k>=0;k--) for (int x=l+K-A[ord[i]][j];x<=r;x++) dp[x][k]|=dp[x-(K-A[ord[i]][j])][k-1];

		bool f=i==0||vct[i-1].second>vct[i].second;
		dp0[i+1][l]=-INF;
		for (int x=l;x<=r;x++){
			for (int k=0;k<=K;k++) if (dp[x][k]){
				int p=x-k*K-(f?0:1);
				if (p<(i==0?0:L[i-1])) continue;
				dp0[i+1][x]=max(dp0[i+1][x],dp0[i][p]+k);
			}
			dp0[i+1][x+1]=dp0[i+1][x];
		}
	}
	cout<<N*M-dp0[N][M*K]<<'\n';
}
#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...