zhouzhengxuan
2024-11-16 11:54:22
题目传送门
一道贪心题。
将每一道题目排序,主要按算法种类排序(可升可降),次要按好处降序排序。遍历
再判断是不是每个算法都足够掌握了,以及会不会连续做两道重复类型的题。第二个就有点难了:
最致密的做题方法是:做一道这个算法的题,再做一道其他类型的题,一题一题的交错地做,所以我们只需要判断这个算法要做的题的数量是否大于其他题目的总数,如果是,那么要补题补到条件不成立为止,如果做不到,输出
#include<bits/stdc++.h>
using namespace std;
const int MAXN=1e5+10;
struct problem{
int a,b;
}t[MAXN];
bool cmp(problem x,problem y){
if(x.a!=y.a)return x.a<y.a;
else return x.b>y.b;
}
int n,m,k,ans[MAXN],sum,c[MAXN];
int main(){
cin>>m>>n>>k;
for(int i=0;i<n;i++){
cin>>t[i].a;
t[i].a--;//输入从1开始,这里从0开始(个人习惯)
}
for(int i=0;i<n;i++){
cin>>t[i].b;
}
sort(t,t+n,cmp);
for(int i=0;i<n;i++){
if(c[t[i].a]<k){
ans[t[i].a]++,sum++,c[t[i].a]+=t[i].b;//没有必要就不做
}
}
for(int i=0;i<m;i++){//特判
if(c[i]<k){
cout<<-1;
return 0;
}
}
for(int i=0;i<m;i++){//特判
if(ans[i]>sum-ans[i]+1){//如果不能一题一题的交错,就不符合题意
if(ans[i]*2<=n){//补题
sum=ans[i]*2;
break;
}
cout<<-1;
return 0;
}
}
cout<<sum;
return 0;
}
蒟蒻的题解,求过。