題目鏈結
可以很容易地想出暴力思路,但複雜度高達o(n2),所以必須優化
思路1:不難發現在a陣列到i,b陣列到j處,在它們前面的有i*j個,這i*j個數不可能比它大,所以只要在暴力列舉過程中判斷i*j<=n即可。
最後只要對和排序,求出前n個。注意存放和的陣列不能只有n個。
vectorsum;for(int i=1; i<=n; i++)
}sort(sum.begin(),sum.end());
printf("%u
",sum[0
]);for(int i=1; i)
思路2:
暴力列舉的解法裡,除了全部n2個弄完再排序之外,還可以使用乙個優先佇列。
由於要求最小的n個,所以這個佇列的「容積」是n,一旦元素個數已達到n個,並且新的和小於隊頭,那麼就先出隊再將新的和入隊。
注意到:當a到i,b到j時,如果新的和大於隊頭,那麼後面再怎麼遍歷也不會小於隊頭了。所以可以這樣優化:
for(int i=0; i)else
}}
做題記錄22 3 31 洛谷P2250
由於csdn新增了字數限制,即日起本人開始轉戰 題目鏈結 這題我原本的想法是 按先x後y的公升序排序,隨後對於任意乙個i,查詢和i 1相交的部分,並在這部分從右往左種樹。最後進行檢查,把不滿足條件的地點種上樹即可。但這種方法好像難以實現,因為情況比較多,比如完全包含 部分相交 完全不相交等。其實可以...
洛谷狀壓DP做題記錄
題面確實是狀壓的入門題 用dp i j 表示以i結尾,狀態為j時的方案數,如下 includeusing namespace std const int maxn 1e6 7 const int n 20 int n,k ints maxn long long dp n maxn long long...
做題記錄 P6749 Yoshino
乙個長度為 n 的序列,第 i 項為 a i 對數列進行 m 次操作。l r x 把數列下標在 l,r 區間內的數賦值為了乙個從 x 開始公差為 1 的等差數列。查詢整個數列中的逆序對個數。n,m le 3 times 10 4 考慮逆序對本質。每次賦值等差序列是不會出現逆序對的。設當前修改的是 l...