我是靠谱客的博主 乐观黄蜂,最近开发中收集的这篇文章主要介绍小朋友做游戏 (贪心双指针,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

添加链接描述
先讨论奇偶时是否可以选A成立
然后就是贪心双指针 先尽量选最大的
然后减去B不应该选的 最后加上A应该选的
要记得a b数组情况 否则影响贪心

#include<bits/stdc++.h>
using namespace std;
const int N=2e4+9;
#define int long long
typedef long long ll;
int a[N],b[N],suma[N],sumb[N];
signed main(){
    int T;
    cin>>T;
    while(T--){
        int A,B,n,ans=0;
        cin>>A>>B>>n;
        memset(a,0,sizeof a);
        memset(b,0,sizeof b);
        for(int i=0;i<A;i++)scanf("%d",&a[i]);
        for(int i=0;i<B;i++)scanf("%d",&b[i]);
        sort(a,a+A,greater<int>());
        sort(b,b+B,greater<int>());
        if((n/2+1)>A&&(n%2)){//n为奇数  a不够选
            puts("-1");
            // cout<<"---"<<endl;
            continue;
        }
        else if((n%2==0)&&((n/2)>A)){
            puts("-1");
            continue;
        }
        if(n>A+B){
            puts("-1");
            continue;
        }   
            // int better=-1;
            // for(int i=0;i<min(A,B);i++){
            //     if(sumb[i]>suma[i]){
            //         better
            //     }
            // }

            // for(int i=0;i<min((n/2),B);i++)ans+=b[i];//尽量选b
            // n-=min((n/2),B);
            // if(n>A){
            //     puts("-1");
            //     continue;
            // }
            // for(int i=0;i<n;i++)ans+=a[i];
            // cout<<"---";
            int i=0,j=0;
            while((i<A||j<B)){
               if(i+j>=n)break;
                if(a[i]>=b[j]){
                    ans+=a[i];
                    i++;
                }
                else if(a[i]<b[j]){
                    ans+=b[j];
                    j++;
                }
            }
            int tot=0;
            // cout<<ans<<endl;
            // cout<<"///"<<i<<" "<<j<<endl;
           for(int k=(n/2);k<j;k++){
               ans-=b[k];
            //    cout<<k<<" "<<b[k]<<endl;
               tot++;
           }
           for(int k=i;k<min(A,n-(n/2));k++){
               tot--;
               ans+=a[k];
           }
        //    cout<<tot<<endl;
           
           if(tot!=0)puts("-1");
           else cout<<ans<<endl;
        
    }
    
    return 0;
}

最后

以上就是乐观黄蜂为你收集整理的小朋友做游戏 (贪心双指针的全部内容,希望文章能够帮你解决小朋友做游戏 (贪心双指针所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部