有点像暴力
2026-08-18 16:40:49
发布于:广东
2阅读
0回复
0点赞
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll N = 1e5+10;
ll m,n,k,a[N],b[N];
vector<ll>s[N];
int main()
{
cin>>m>>n>>k;
for(int i = 1;i<=n;i++)
cin>>a[i];
for(int i = 1;i<=n;i++)
cin>>b[i],s[a[i]].push_back(b[i]);
for(int i = 1;i<=m;i++)
sort(s[i].begin(),s[i].end(),greater<ll>());
//上面代码就是将每道题的b[i](各种提升的掌握程度)汇总并进行从大到小排序
ll need[N] = {};//先默认所有单个算法所需要的做题数均为0
ll total = 0;//所有算法加一起所需要的做题数
for (ll i = 1; i <= m; i++) {//遍历每个算法
ll sum = 0;//目前该算法的掌握程度为0
for(ll j = 0;j<s[i].size();j++)//枚举该算法能提升的掌握程度的下标
{
sum+=s[i][j];
if(sum>=k)
{ //记录第i个算法最少需要j+1次学习
need[i] = j+1;//j是0开始数的,所以要+1;
break;
}
}
if (need[i] == 0) {//need[i]没被赋值,说明没有超过>=k的情况 说明不行
//不行直接打印-1结论 return 0结束整个程序
cout << -1 << endl;
return 0;
}
total += need[i];//记录所有算法的总和学习次数
}
// 检查是否有某种算法的数量 > 剩余算法数量的总和+1 这种情况是不行的
for (ll i = 1; i <= m; i++) {
if (need[i] > total - need[i] + 1) {
cout << -1 << endl;
return 0;
}
}
cout << total << endl;
return 0;
}
这里空空如也


有帮助,赞一个