1 solutions

  • 0
    @ 2025-8-26 10:24:33
    #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