贪心算法之取手套问题(牛客)
生活随笔
收集整理的這篇文章主要介紹了
贪心算法之取手套问题(牛客)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
解法框架
待定
手套
這道題的關鍵點如下
所以本題的解題思路就是,首先拿取左面或右面的手套,使拿取的數目覆蓋全部顏色,然后相應的另一半手套只需挑出一即可
以拿出左面為例,有5只顏色不同的左手套
由于無法分辨顏色,所以拿取的時候,如果數目太小,就可能無法覆蓋全部手套。比如拿取15只手套,白色的可能就沒有覆蓋到。所以一旦左面取了15只,就白色的沒取,而右面取了一只,恰好就是白色,就導致無法匹配
而如果全取,就不能保證題目“至少”要求了
所以應該這樣取:手套數目=總手套數目-最少的顏色的手套+1 。這樣取一定可以保證所有手套全部覆蓋到
如果一個手套中出現了0,那么將導致對應的手套無法被匹配到,所以這種情況下要把0對應的手套(不管是左還是右都取出來),才能保證不被這種糟糕的情況給破壞掉
最后應該是取左面還是右面的呢?其實這不重要,左面小就取左面的,右面小就取右面的,最后只需在對方手套中取一只即可。
代碼
class Gloves { public:int findMinimum(int n, vector<int> left, vector<int> right) {int left_sum=0;int right_sum=0;//分別計算左面手套和右面手套的綜合int left_min=INT_MAX;int right_min=INT_MAX;//分別用來保存左面或者右面的最小手套數目int sum_zero=0;//統計一方出現手套為0的手套數目for(int i=0;i<n;i++)//有n種顏色的手套{if(left[i] * right[i] == 0)//只要一方有0,統計{sum_zero+=left[i]+right[i];}else{left_sum+=left[i];//統計左手套的數目left_min=min(left_min,left[i]);//左手套中顏色最少的right_sum+=right[i];//同上right_min=min(right_min,right[i]);}}//誰少取誰int get=min(left_sum-left_min+1,right_sum-right_min+1);return sum_zero+get+1;//最后返回時只要任取對面的1個手套以及取完所有為0的情況和一方手套} };總結
以上是生活随笔為你收集整理的贪心算法之取手套问题(牛客)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css 用direction来改变元素水
- 下一篇: JQ属性和css部分测试