description
對於乙個整數數列a[0], a[1], …, a[n-1]進行分組,要求每組1到2個數,並且同組之和不能大於w. 求最少可以分成多少組.
1 <= n <= 100000, 1 <= a[i] <= w <= 1000000000.
請實現下面solution類中計算minpartition(a, w)的函式.
例1:當a = , w = 5, minpartition(a, w)返回3. 將2和3放一組,4和5各自單獨作為一組,共3組.class solution
};
例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...