題目鏈結
一道容易想岔的題.
一開始用了貪心的方法先排序後從末尾開始掃瞄陣列.idx的移動規則:移動到i-a[i]的位置直到將要越界為止.這個思路是有漏洞的,比如說下面這組資料:5 3 3 3 3 3 1 1
這麼貪心輸出的答案是2其實正確的答案是3.因為我們把最後乙個3歸入到第一組裡得到的答案會更好.讓剩下兩個1各自一組.那麼就得換個思路.
dp:從前面開始掃瞄陣列.用i表示當前人數.dp[i]表示的是到第i個人時如果把他作為新的一隊的話最多能劃分為多少隊,那麼如果說a[i] > i的話,無法滿足,dp[i] = 0,否則就把i-a[i]這個範圍上的人劃分為一組dp[i] = dp[i-a[i]]+1.不過這樣的話dp[n]依然不一定是正確答案,因為我們可以把更大的範圍劃分為一組.就如同上面那個樣例一樣.我們不一定要劃分最後5個人為一組,可以適當擴大範圍,得出來的答案可能更優.我看有些部落格是每次都往前掃瞄[1,i-a[i]]這個範圍上的答案,讓dp[n]最後為正確答案.雖然也可以得出正確答案,但顯的有點麻煩了.其實只需要多新增乙個ans變數,記錄一下這個dp過程中得到的最大值是多少就可以了.
值得注意的是題目是保證有解的.如果說會出現無解的情況需再做考慮.
附上**
#define ll long long
#include
#include
#include
#include
#include
#include
using
namespace std;
const
int inf =
0x3f3f3f3f
;const
int n =
1e6+10;
int a[n]
,dp[n]
;int
main()
cout << ans;
return0;
}/**/
jzoj3792,P2062 分隊問題 貪心
題解上說 然而我的貪心不僅a了,而且 反例也a了 n個人,每個人有乙個要求a i 表示他所在的隊伍裡不可以少於a i 個人,然後可以分成求最大的隊伍數量。貪心的思想就是盡量將要求大的人放在一起。所以我們要先排個序,從大到小,然後用乙個now表示當前佇列還需多少個人可以滿足條件 初始 now a 1 ...
洛谷 約瑟夫問題(P1996,佇列)
n 個人圍成一圈,從第乙個人開始報數,數到 m 的人出列,再由下乙個人重新從 1 開始報數,數到 m 的人再出圈,依次類推,直到所有的人都出圈,請輸出依次出圈人的編號。輸入格式 輸入兩個整數 n,m。輸出格式 輸出一行 n 個整數,按順序輸出每個出圈人的編號。輸入輸出樣例 輸入10 3 輸出3 6 ...
洛谷P2158 儀仗隊
作為體育委員,c君負責這次運動會儀仗隊的訓練。儀仗隊是由學生組成的n n的方陣,為了保證隊伍在行進中整齊劃一,c君會跟在儀仗隊的左後方,根據其視線所及的學生人數來判斷隊伍是否整齊 如下圖 現在,c君希望你告訴他隊伍整齊時能看到的學生人數。輸入格式 共乙個數n 輸出格式 共乙個數,即c君應看到的學生人...