답안 #134345

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
134345 2019-07-22T13:26:39 Z rajarshi_basu Olympiads (BOI19_olympiads) C++14
0 / 100
287 ms 4648 KB
#include <iostream>
#include <vector>
#include <set>
#include <iomanip>
#include <algorithm>
#include <functional>
#include <stdio.h>
#include <cmath>
#include <queue>
#include <string>
#include <map>
#include <fstream>
#include <complex>
#include <random>
#include <stack>
#include <chrono>
#include <set>
 
#define FOR(i,n) for(int i=0;i<n;i++)
#define FORE(i,a,b) for(int i=a;i<=b;i++)
#define ll long long int
#define vi vector<int>
#define ii pair<int,int>
#define pb push_back
#define mp make_pair
#define ff first
#define il pair<int,ll>
#define li pair<ll,int>
#define ss second
#define pll pair<ll,ll>
#define cd complex<double> 
#define ld long double
#define pld pair<ld,ld>
#define iii pair<ii,ll>
#define vv vector
 
using namespace std;
 
const int MAXN = 501;
 
int n,k;
vv<int> all[MAXN];
multiset<int,greater<int> > allV;
 
// for subspace : 1 = taken, 0 = not to be taken. 2 = can be either.
 
 
 
struct data{
	int* arr;
	int sum;
	data(int* a,int s){
		arr = a;
		sum = s;
	}
};
 
bool comp( data d1, data d2){
	return d1.sum < d2.sum;
}
 
//queue<int*> q;
priority_queue<data,vector<data>, function<bool(data,data)> > pq(comp);
 
int evaluateSpace(int* arr,vi& ans){
	//cout << "ENTERED" << endl;
	//FOR(i,n)cout << arr[i] << " ";cout << endl;
	vi valid;
	vi taken;
	FOR(i,n)if(arr[i] == 2)valid.pb(i);else if(arr[i] == 1)taken.pb(i);
	int numT = k - taken.size();
	if(valid.size() < numT){
		return 0;
	}
	set<int> goood;
	FOR(sortItem,k){
		sort(valid.begin(), valid.end(),[&](int a,int b){
			if(goood.find(a) != goood.end())return false;
			if(goood.find(b) != goood.end())return true;
			return all[a][sortItem] >= all[b][sortItem];
		});
		goood.insert(valid[0]);
	}
	vi good;
	for(auto e : goood)good.pb(e);
 
	int mx = 0;
	
	
	//cout << numT << endl;
	//cout << good.size() << endl;
 
	FOR(mask,1<<good.size()){
		if(numT > good.size())break;
		vi cc;
		FOR(j,good.size()){
			if(((1<<j)&mask) > 0){
				cc.pb(good[j]);
			}
		}
		if(cc.size() == numT){
			// this is a candidate choice
			int sum = 0;
			int xx[k];
			FOR(i,k)xx[i] = 0;
			for(auto e : taken){
				FOR(i,k)xx[i] = max(xx[i],all[e][i]);
			}
			for(auto e : cc){
				FOR(i,k)xx[i] = max(xx[i],all[e][i]);	
			}
			FOR(i,k)sum += xx[i];
			if(sum > mx){
 
				mx = sum;
				ans = cc;
			}
		}
	}
	//cout << "EXITED" << endl;
	return mx;
}
 
void processSubspace(int* space){
	vi ans;
	vi ans2;
	int an = evaluateSpace(space,ans);
	if(an == 0)return;
	allV.insert(an);
	
	//cout << an << endl;
	// ans now contains the stuff that i am to take.
	FOR(i,ans.size()){
		int* arr = new int[n];
		FOR(j,n)arr[j] = space[j];
		FOR(j,i){
			arr[ans[j]] = 1;
		}
		arr[ans[i]] = 0;
		int x = evaluateSpace(arr,ans2);
		pq.push(data(arr,x));
	}
	ans2.clear();
}
 
void solve(){
	int arr[n];
	FOR(i,n)arr[i] = 2;
	processSubspace(arr);
	while(!pq.empty() and allV.size() < 2100){
		data d = pq.top();pq.pop();
		processSubspace(d.arr);
	}
}
 
int main(){
	int c;
	cin >> n >> k >> c;
	FOR(i,n){
		FOR(j,k){
			int a;
			cin >> a;
			all[i].pb(a);
		}
	}
	solve();
	int ctr = 0;
	for(auto e : allV){
		ctr++;
		if(c == ctr){
 
			cout << e << endl;
			return 0;
		}
		//cout << e << endl;
	}
	return 0;
}

Compilation message

olympiads.cpp: In function 'int evaluateSpace(int*, std::vector<int>&)':
olympiads.cpp:72:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  if(valid.size() < numT){
     ~~~~~~~~~~~~~^~~~~~
olympiads.cpp:94:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(numT > good.size())break;
      ~~~~~^~~~~~~~~~~~~
olympiads.cpp:19:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i,n) for(int i=0;i<n;i++)
olympiads.cpp:96:7:
   FOR(j,good.size()){
       ~~~~~~~~~~~~~            
olympiads.cpp:96:3: note: in expansion of macro 'FOR'
   FOR(j,good.size()){
   ^~~
olympiads.cpp:101:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   if(cc.size() == numT){
      ~~~~~~~~~~^~~~~~~
olympiads.cpp: In function 'void processSubspace(int*)':
olympiads.cpp:19:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
 #define FOR(i,n) for(int i=0;i<n;i++)
olympiads.cpp:133:6:
  FOR(i,ans.size()){
      ~~~~~~~~~~~~              
olympiads.cpp:133:2: note: in expansion of macro 'FOR'
  FOR(i,ans.size()){
  ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 287 ms 4648 KB Output is correct
2 Runtime error 3 ms 504 KB Execution killed with signal 11 (could be triggered by violating memory limits)
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 124 ms 1136 KB Output is correct
2 Correct 101 ms 1204 KB Output is correct
3 Incorrect 117 ms 960 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 4 ms 504 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 287 ms 4648 KB Output is correct
2 Runtime error 3 ms 504 KB Execution killed with signal 11 (could be triggered by violating memory limits)
3 Halted 0 ms 0 KB -