演算法期中1000 分組

2021-08-10 17:24:47 字數 1381 閱讀 6621

description

對於乙個整數數列a[0], a[1], …, a[n-1]進行分組,要求每組1到2個數,並且同組之和不能大於w. 求最少可以分成多少組.

1 <= n <= 100000, 1 <= a[i] <= w <= 1000000000.

請實現下面solution類中計算minpartition(a, w)的函式.

class solution 

};

例1:當a = , w = 5, minpartition(a, w)返回3. 將2和3放一組,4和5各自單獨作為一組,共3組.

例2:當a = , w = 7, minpartition(a, w)返回2. 將2和5放一組,3和4一組,共2組.

注意:你只需要提交solution類的**,你在本地可以編寫main函式測試程式,但不需要提交main函式的**. 注意不要修改類和函式的名稱.

解析:

當時沒想出來,一直想啥動態規劃。之後和室友交流下,其實思路很簡單。自己居然把排序等一般的方法都忘了,思維太侷限了。leetcode要認真打了啊。。。

把a從小至大排序。找到能和最小的數字匹配的最大的數字的下標,這些數字一一配對,處理一下,即可得最大的對數。然鵝我的思路還是wa,參考了別人的**才發現自己的疏漏。第乙個函式是我的錯誤**,第二個是正確的。

正確思路舉例:w = 8,序列為2 4 5 6 7

先把陣列從小到大排序,盡可能多劃分組,就要求小的和盡量大的一組。

head指標從頭取剩餘最小的,tail指標從尾部找能和head相加後小於w的最大值。tail每輪迴圈都要向向前移動一位,即tail–,同時res++,因為tail所指向的數字必須單獨列為一組。如果tail所值的數字和head所指的數字相加滿足要求,則head++,tail–,res++(因為得到一組)。最終假設還剩下兩個數,head指向第乙個,tail指向第二個數。① 二者相加符合條件,則head++,tail–並且res++。不滿足head < tail,結束。②二者相加不符合條件,則tail–,res++,進入下一輪迴圈此時head == tail,不符合head < tail,所以結束。但是head 和tail所指的數字仍自成一組,故res++。

**:

class solution 

pairsnum = (doublepairsnum + 1) / 2;

return size - pairsnum;

}

正確的解答:

int minpartition(vector

a, int w)

res++;

}if (tail == head)

res++;

return res;

}};

演算法期中 分組

對於乙個整數數列a 0 a 1 a n 1 進行分組,要求每組1到2個數,並且同組之和不能大於w.求最少可以分成多少組.1 n 100000,1 a i w 1000000000.例1 當a w 5,minpartition a,w 返回3.將2和3放一組,4和5各自單獨作為一組,共3組.例2 當a...

2066 分組統計

時間限制 1 sec 記憶體限制 32 mb 提交 474 解決 115 提交 狀態 討論版 命題人 外部匯入 先輸入一組數,然後輸入其分組,按照分組統計出現次數並輸出,參見樣例。輸入第一行表示樣例數m,對於每個樣例,第一行為數的個數n,接下來兩行分別有n個數,第一行有n個數,第二行的n個數分別對應...

模擬8 03 分組

好題 k 1做法 直接倒著找,滿足貪心性質,預處理出每個平方數就行.1 include2 include3 include 4 include5 include6 include7 include8 include 9 include10 define maxn 300001 11 define i...