Submission #1333675

#TimeUsernameProblemLanguageResultExecution timeMemory
1333675sporknivesIMO (EGOI25_imo)C++20
20 / 100
5 ms368 KiB
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int,int> pii;

bool cmp(pair<vector<int>,int> p1, pair<vector<int>,int> p2) {
	vector<int> v1 = p1.first, v2 = p2.first;
	int id1 = p1.second, id2 = p2.second;
	int s1=0; for(int x:v1)s1+=x;
	int s2=0; for(int x:v2)s2+=x;
	if(s1!=s2) {
		return s1>s2;
	}
	else return id1<id2;
}

signed main() {
	int n,m,k; cin>>n>>m>>k;
	// faster execution 
	if(n*m>20) return 0;
	vector<pair<vector<int>, int>> a(n);
	
	for(int i=0;i<n;i++) {
		vector<int> score(m);
		for(int j=0;j<m;j++)cin>>score[j];
		a[i]={score,i};
	}
	
	sort(a.begin(),a.end(),cmp);
	
	int prevmin;
	int ans=INT_MAX;
	for(int i=0;i<(1<<(n*m));i++) {
		int popcnt=0;
		
		bool valid=true;
		for(int j=0;j<n;j++) {
			int mn=0,mx=0;
			for(int l=0;l<m;l++) {
				if(i&(1<<(j*m+l))) {
					mn+=(a[j].first)[l];
					mx+=(a[j].first)[l];
					popcnt++;
				}
				else {
					mx+=k;
				}
			}
			if(j==0){
				prevmin = mn;
				continue;
			}
			if(a[j].second > a[j-1].second) {
				if(mx>prevmin)valid=false;
			}
			else {
				if(mx>=prevmin)valid=false;
			}
			prevmin = mn;
		}
		
		if(valid) ans=min(ans,popcnt);
		/*if(i==(1<<24)-((1<<9)+(1<<11)+(1<<18)+(1<<21)) && !valid) {
			
			for(int j=0;j<n;j++) {
				for(int l=0;l<m;l++) {
					if(i&(1<<(j*n+l))) {
						cout<<(a[j].first)[l]<<" ";
					}
					else {
						cout<<"? ";
					}
				}
				cout<<"\n";
			}
			cout<<'\n';
		}*/
	}
	
	cout<<ans;
	return 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...