1.5学习博客

1.5 今天继续在贪心算法做了练习。

第一题:https://leetcode-cn.com/problems/two-city-scheduling/

对于这种类型的问题,我们可以这么想,让所有的人先都去B地,总费用为所有人去B的费用之和

,然后其中一半的人是要去A的,这时每个去A的人的花费为priceA=priceB+(priceA-priceB),其中priceA-priceB可以是负值,

表示去A地的价格比去B地少。所以在都去B地的基础上,找到N个最小的priceA-priceB即可,这N个为去A的人。

部分代码如下:

int k(const void*a,const void*b){

    return *(int*)a-*(int*)b;

}

int twoCitySchedCost(int** costs, int costsSize, int* costsColSize){

int i,sum=0;

int a[costsSize];

for(i=0;i<costsSize;i++){

    sum+=costs[i][1];

    a[i]=costs[i][0]-costs[i][1];

}

qsort(a,costsSize,sizeof(int),k);

for(i=0;i<costsSize/2;i++){

    sum+=a[i];

}

return sum;

}

该题的模型在比赛中出现率还是挺高的,对于该类问题,对题目本身进行分析之后,

采用全分到一边,再进行分开的思路,分开取决于其差值的排序。

第二题:https://leetcode-cn.com/problems/find-the-minimum-number-of-fibonacci-numbers-whose-sum-is-k/

题目分析来自Leetcode官方题解,如下:

这样就很清晰的证明了为什么要优先选取比所给数值小的最大的斐波那契数。(虽然证明过程不需要很明白,

但是看看总是好的!严谨,有理有据的)。

部分代码:

由于题中所给K小于10的9次方,所以在创建数组的时候创建44位即可,因为斐波那契数列第45超过了10的9次方。

这道题其实很容易想到去优先选择最大的符合要求的斐波那契数,但是证明过程我觉得有必要分享一下,很严谨的数学推理!

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值