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