LCP 40. 心算挑战-快速排序+贪心算法

LCP 40. 心算挑战-快速排序+贪心算法

「力扣挑战赛」心算项目的挑战比赛中,要求选手从 N 张卡牌中选出 cnt 张卡牌,若这 cnt 张卡牌数字总和为偶数,则选手成绩「有效」且得分为 cnt 张卡牌数字总和。
给定数组 cards 和 cnt,其中 cards[i] 表示第 i 张卡牌上的数字。 请帮参赛选手计算最大的有效得分。若不存在获取有效得分的卡牌方案,则返回 0。

示例 1:

输入:cards = [1,2,8,9], cnt = 3

输出:18

解释:选择数字为 1、8、9 的这三张卡牌,此时可获得最大的有效得分 1+8+9=18。

示例 2:

输入:cards = [3,3,1], cnt = 1

输出:0

解释:不存在获取有效得分的卡牌方案。

提示:

1 <= cnt <= cards.length <= 10^5
1 <= cards[i] <= 1000

个人觉得这题还挺难的,主要说我们先要有一个整体的思路,然后在整体的思路上今年数学的替换,解题代码如下:




 void quick(int *a,int low,int high){
    if(low<high){
        int l=low,h=high,p=a[low];
        while(low<high){
            while(low<high&&a[high]<=p){
                high--;
            }
            a[low]=a[high];
           
            while(low<high&&a[low]>=p){
                low++;
            }
            a[high]=a[low];
           
        }
        a[low]=p;
       
        quick(a,l,low-1);
        quick(a,low+1,h);
    }
}

int maxmiumScore(int* cards, int cardsSize, int cnt){
    quick(cards,0,cardsSize-1);

    int min_b=cards[0],min_e=cards[0];
    int sum=0;
    int i;
    for( i=0;i<cnt;i++){
        sum=sum+cards[i];
        if(cards[i]%2==1){
            min_b=fmin(min_b,cards[i]);
        }
        else{
              min_e=fmin(min_e,cards[i]);

        }

    }
    if(sum%2==0){
        return sum;
    }
   
   int max=0;
    for(;i<cardsSize;i++){
       
        if(cnt==1){
            if(cards[i]%2==0){
              sum=sum-min_b+cards[i];
               return sum;
           }
           continue;

        }
        if(cards[i]%2==0){
            max=fmax(max,sum-min_b+cards[i]);
             
        }
        if(cards[i]%2==1){
              max=fmax(max,sum-min_e+cards[i]);
        }

    }
    
    return max;
 




}




你可能感兴趣的:(力扣刷题,c++与c语言,贪心算法,算法)