日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

贪心算法之取手套问题(牛客)

發布時間:2025/3/15 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 贪心算法之取手套问题(牛客) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

解法框架

待定

手套

這道題的關鍵點如下

  • A先生是無法分辨手套的顏色的,但是能分辨手套的形狀,這也意味著他在取手套時并不是隨意一把抓,而是可以有目的的取左手套或者右手套(其實我在起初做這道題的時候沒有注意這一點,意味是隨機一把抓,這無形之中就增大了難度)
  • 如果沒有至少這個關鍵詞,同時題目又保證了手套絕對是可以匹配的,所以可以全部把左手套拿出來,然后右手套隨機取一只
  • 有了“至少”后,它就體現了一種貪心的思想——每次局部最優,最后全局最優
  • 這道題特別注意手套為0的這種情況,因為一旦某個顏色手套的數目為0,將導致該顏色的手套是不可能匹配的,那么如果還要硬拿出來,無形之中增大了拿取次數
  • 所以本題的解題思路就是,首先拿取左面或右面的手套,使拿取的數目覆蓋全部顏色,然后相應的另一半手套只需挑出一即可

    以拿出左面為例,有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的情況和一方手套} };

    總結

    以上是生活随笔為你收集整理的贪心算法之取手套问题(牛客)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。