C. Berland Regional

C. Berland Regional

题目链接

题目大意
有多个学校,每个学校若干名学生,每个学生有不同的能力,要求每个队人数有k(k>=1&&k<=n)的限制,只有当每个队人数为k时,才能派出比赛,问在不同人数下,能力值总和最大为多少?
思路
能力值高者优先派出,所以从大到小排个序,然后用每个学校的队员数模一个队的人数,有余数就不派倒数的几个人去。这样可以的到最优解。
通过代码

#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimization ("unroll-loops")
using namespace std;
#define ll long long
#define ios ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define sl(n) scanf("%lld",&n)
#define pl(n) printf("%lld",n)
#define sdf(n) scanf("%lf",&n)
#define pdf(n) printf("%.lf",n)
#define pE printf("\n")
#define ull unsigned long long
#define pb push_back
#define debug(a) cout<<a<<"??"
#define me(a)  memset(a,0,sizeof(a))
#define pre(i,beg,en) for(ll i=beg;i<=en;i++)
#define rep(i,beg,en) for(ll i=beg;i>=en;i--)
#define ph push
#define pi pair<ll,ll>
#define fi first
#define se second
const ll mod = 1e9 + 7;
bool cmp(ll a,ll b)
{
  return a>b;
}
int main(){

       
        ll t;
        sl(t);
        while(t--){
          ll n;
          sl(n);
          std::map<ll, vector<ll>> mp;
          std::vector<ll> un(n+1);
          std::vector<ll> ans(n+1);

          pre(i,1,n)sl(un[i]);

          pre(i,1,n){
            ll q;
            sl(q);
            mp[un[i]].pb(q);
          }

          for(auto [u,s]:mp){

          sort(s.begin(),s.end(),cmp);
          
          ll len=s.size();
          
          std::vector<ll> pp(len+1);

          pre(i,1,len)pp[i]=pp[i-1]+s[i-1];

          pre(i,1,len)ans[i]=ans[i]+pp[len-len%i];

          }

         for(ll i=1;i<=n;i++)cout<<ans[i]<<' ';
          puts("");
        }
        return 0;
}
上一篇:安装node


下一篇:通过实例理解Go逃逸分析