1 solutions
-
0
#include<bits/stdc++.h> using namespace std; const int N=1e5+10; vector<int> score[N+2]; int a[N],b[N],need[N]; bool cmp(int a,int b) { if(a>b) return 1; return 0; } int main() { int n,m,k; cin>>m>>n>>k; for(int i=0;i<n;i++) cin>>a[i]; for(int i=0;i<n;i++) { cin>>b[i]; score[a[i]].push_back(b[i]);//将知识点相同的放到同一个地方 } int ans=0,mx_need=0,mx_need_i=-1; for(int i=1;i<=m;i++) //对应每个知识点 { sort(score[i].begin(),score[i].end(),cmp); int sum=0;//当前的知识点的总和 for(int j=0;j<score[i].size();j++) { sum+=score[i][j];//累加分数 if(sum>=k) //当前符合要求 { need[i]=j+1; //需要的数目 break; } } if(sum<k) //当前知识点无法得到满足 { cout<<-1; return 0; } ans+=need[i];//累加题目数 if(need[i]>mx_need) //更新最大题目需要的知识点数目 { mx_need=need[i]; mx_need_i=i; } } if(mx_need-1<=ans-mx_need) //可以间隔知识点 { cout<<ans<<endl; return 0; } int last=0;//除开最大的题目数需要的数量 for(int i=1;i<=m;i++) { if(i!=mx_need_i) { last+=score[i].size()-need[i]; } } if(mx_need-1<=ans-mx_need+last) //剩余的题目可以满足交叉 { cout<<2*mx_need-1; } else { cout<<-1;//没有办法交叉 } return 0; }
- 1
Information
- ID
- 2204
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 9
- Tags
- # Submissions
- 29
- Accepted
- 2
- Uploaded By