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;
}