답안 #134422

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
134422 2019-07-22T16:33:47 Z rajarshi_basu Olympiads (BOI19_olympiads) C++14
0 / 100
90 ms 4940 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];
vi allV;
 
int XX[20000][501];
int ptr = 0;
inline int* get(){
    return XX[ptr++];
}

// 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(const data& d1,const data& d2){
    return d1.sum < d2.sum;
}
 
//queue<int*> q;
priority_queue<data,vector<data>, function<bool(const data&,const 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);
    }
    if(taken.size() == k){
        int xx[k];
        FOR(i,k)xx[i] = 0;
           
        for(auto e : taken){
            FOR(i,k)xx[i] = max(xx[i],all[e][i]);
        }
        int sum = 0;
        FOR(i,k)sum += xx[i];
            
        return sum;
    }
    if(valid.size() == 0)return 0;
 
    int numT = k - taken.size();
    if(valid.size() < numT){
        return 0;
    }
    set<int> goood;
    FOR(sortItem,k){
        if(valid.size() == 0)break;
        int besti = -1;
        for(auto x : valid){
            if(goood.find(x) != goood.end())continue;
            if(besti == -1){
                besti = x;
            }else{
                if(all[x][sortItem] > all[besti][sortItem]){
                    besti = x;
                }
            }
        }
        goood.insert(max(besti,*goood.begin()));
    }
    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;
}
 
inline void processSubspace(int* space){
    vi ans;
    vi ans2;
    int an;
    an = evaluateSpace(space,ans);
    
    if(an == 0)return;
    allV.pb(an);
    
    //cout << an << endl;
    // ans now contains the stuff that i am to take.
    FOR(i,ans.size()){
        int* arr = get();
        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() < 2200){
        data d = pq.top();pq.pop();
        processSubspace(d.arr);
    }
}
 
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int c;
    cin >> n >> k >> c;
    FOR(i,n){
        FOR(j,k){
            int a;
            cin >> a;
            all[i].pb(a);
        }
    }
    solve();
    sort(allV.begin(), allV.end(), greater<int>());
    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:80:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(taken.size() == k){
        ~~~~~~~~~~~~~^~~~
olympiads.cpp:95:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     if(valid.size() < numT){
        ~~~~~~~~~~~~~^~~~~~
olympiads.cpp:124:17: 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:126:13:
         FOR(j,good.size()){
             ~~~~~~~~~~~~~      
olympiads.cpp:126:9: note: in expansion of macro 'FOR'
         FOR(j,good.size()){
         ^~~
olympiads.cpp:131:22: 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:166:9:
     FOR(i,ans.size()){
         ~~~~~~~~~~~~           
olympiads.cpp:166:5: note: in expansion of macro 'FOR'
     FOR(i,ans.size()){
     ^~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 8 ms 1528 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 2 ms 376 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 90 ms 4940 KB Output is correct
2 Correct 86 ms 4716 KB Output is correct
3 Incorrect 2 ms 376 KB Output isn't correct
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 8 ms 1528 KB Output isn't correct
2 Halted 0 ms 0 KB -