THE WEALTHIEST RULER



NN rulers have gathered to decide who is the wealthiest of them all. Each ruler possesses various treasures of different types. There are TT types of treasures where vjvj​ is the value of a treasure of type jj and nijnij ​is the number of treasures of type jj possessed by ruler ii. The rulers have discarded notions such as determining the wealthiest on the basis of total wealth. Instead they have decided to find KK winners where the kk-th winner will be the one whose treasures amount to the greatest value when only the kk most expensive items of each ruler are considered. If there is a tie amongst rulers, the ruler with the lower index is the winner.



#include <bits/stdc++.h>

using namespace std;

#define int            long long int
#define F              first
#define S              second
#define pb             push_back
#define si             set <int>
#define vi             vector <int>
#define pii            pair <int, int>
#define vpi            vector <pii>
#define vpp            vector <pair<int, pii>>
#define mii            map <int, int>
#define mpi            map <pii, int>
#define spi            set <pii>
#define endl           "\n"
#define sz(x)          ((int) x.size())
#define all(p)         p.begin(), p.end()
#define double         long double
#define que_max        priority_queue <int>
#define que_min        priority_queue <int, vi, greater<int>>
#define bug(...)       __f (#__VA_ARGS__, __VA_ARGS__)
#define print(a)       for(auto x : a) cout << x << " "; cout << endl
#define print1(a)      for(auto x : a) cout << x.F << " " << x.S << endl
#define print2(a,x,y)  for(int i = x; i < y; i++) cout<< a[i]<< " "; cout << endl

inline int power(int a, int b)
{
  int x = 1;
  while (b)
  {
    if (b & 1) x *= a;
    a *= a;
    b >>= 1;
  }
  return x;
}

template <typename Arg1>
void __f (const char* name, Arg1&& arg1) { cout << name << " : " << arg1 << endl; }
template <typename Arg1, typename... Args>
void __f (const char* names, Arg1&& arg1, Args&&... args)
{
  const char* comma = strchr (names + 1, ',');
  cout.write (names, comma - names) << " : " << arg1 << " | "; __f (comma + 1, args...);
}

const int N = 200005;

void solve() {


int  n,t,k;
cin>>n>>t>>k;
vector<int>value(t);
vector<vector<int>>pre;
vector<pii>ans(k,{0,0});
for (int i = 0; i < t; i++)
{
    cin>>value[i];
}
for(int i=0; i<n; i++){
    string s;
    cin>>s;
    vector<int>temp;
    for (int j = 0; j < t; j++)
    {
        if(s[j]=='1')temp.push_back(value[j]); 
        else   temp.push_back(0);
    }
    vector<int>prefix(t,0);
    sort(temp.begin(),temp.end(),greater<int>());
    prefix[0]=temp[0];
    for(int j=1; j<t; j++){
        prefix[j]=prefix[j-1]+temp[j];
    }
    pre.push_back(prefix); 
    // print(prefix);
}

for (int i = 0; i < n; i++)
{
    // print(pre[i]);
    for (int j = 0; j < k; j++)
    {
        if(j<t && pre[i][j]>ans[j].first){
            ans[j]={pre[i][j],i+1};
        }
        else if(j>=t){
            if(pre[i][t-1]>ans[j].first){
                ans[j]={pre[i][t-1],i+1};
            }
        }
    }
    
}
for (int i = 0; i < k; i++)
{
    cout<<ans[i].second<<" ";
}






}

int32_t main()
{
  ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);


  clock_t z = clock();

  int t = 1;
//   cin >> t; 
  while (t--) solve();



  return 0;
}

Post a Comment

0 Comments