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;
 




}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
LBP改进算法LCP是一种用于纹理特征提取的算法,它是LBP算法的改进版本。LBP算法是一种用于图像纹理特征提取的算法,它通过比较像素点与周围像素点的灰度值大小关系,将每个像素点转换为二进制,从而提取图像的纹理特征。LCP算法在LBP算法的基础上,引入了旋转不变性和灰度不变性,使得算法更加稳健和准确。 LCP算法的具体步骤如下: 1. 将图像分成若干个小区域,对每个小区域进行处理。 2. 对于每个像素点,计算其与周围像素点的灰度值大小关系,并将结果转换为二进制。 3. 对于每个小区域,将其的所有像素点的二进制进行拼接,得到一个二进制序列。 4. 对于每个二进制序列,将其进行旋转不变性处理,即将其按照字典序排序后,选择最小的一个作为该序列的代表。 5. 对于每个小区域,将其代表序列的二进制转换为十进制,作为该小区域的纹理特征。 下面是一个使用LCP算法提取图像纹理特征的Python代码示例: ```python import cv2 import numpy as np def LCP(img): # 将图像分成16个小区域 h, w = img.shape[:2] h_step, w_step = h // 4, w // 4 features = [] for i in range(4): for j in range(4): # 对每个小区域进行处理 sub_img = img[i*h_step:(i+1)*h_step, j*w_step:(j+1)*w_step] sub_feature = [] # 对每个像素点进行处理 for m in range(1, h_step-1): for n in range(1, w_step-1): center = sub_img[m, n] binary = '' for k in [(m-1, n-1), (m-1, n), (m-1, n+1), (m, n+1), (m+1, n+1), (m+1, n), (m+1, n-1), (m, n-1)]: if sub_img[k] >= center: binary += '1' else: binary += '0' # 将二进制转换为十进制 sub_feature.append(int(binary, 2)) # 对代表序列进行旋转不变性处理 sub_feature.sort() sub_feature = np.array(sub_feature) min_feature = sub_feature for k in range(1, 8): sub_feature = np.roll(sub_feature, 1) if (sub_feature < min_feature).all(): min_feature = sub_feature # 将代表序列转换为十进制,作为该小区域的纹理特征 features.append(min_feature.dot(2 ** np.arange(min_feature.size)[::-1])) return features # 读取图像 img = cv2.imread('test.jpg', 0) # 提取纹理特征 features = LCP(img) print(features) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值