FZU Problem 1919 K-way Merging sort(大数+记忆化搜索)
传送门
As we all known,merge sort is an O(nlogn) comparison-based sorting algorithm. The merge sort achieves its good runtime by a divide-and-conquer strategy,namely,that of halving the list being sorted: the front and back halves of the list are recursively sorted separately,then the two results are merged into the answer list. An implementation is shown as follows:
The procedure Merge(L1,L2:in List_type;L:out List_type) that we have in mind for sorting two lists is described as follows. Initialize pointers to the first item in each list L1,L2,and then repeat ??compare the two items pointed at; ??move the smaller into L; ??move the pointer which originally points at the smaller one to the next number; until one of L1,L2 exhausts; drain the remainder of the unexhausted list into L; Now let us come to the situation when there are k pointers,here k≥2. Let L be a list of n elements. Divide L into k disjoint contiguous sublists L1,L2,…,Lk of nearly equal length. Some Li’s (namely,n reminder k of them,so possibly none) will have length We use Linear-Search-Merge here to merge k sorted lists. We find the smallest of k items (one from each of the k sorted source lists),at a cost of k-1 comparisons. Move the smallest into the answer list and advances its corresponding pointer (the next smallest element) in the source list from which it came. Again there are k items,from among which the smallest is to be selected. (When i (1 ≤ i
Given a list containing n elements,your task is to find out the maximum number of comparisons in k-way merging sort. InputThe first line of the input contains an integer T (TOutput
For each test case,print a line containing the test case number (beginning with 1) and the maximum number of comparisons in k-way merging sort.
Sample Input42 2 3 2 100 7 1000 10 Sample InputCase 1: 1Case 2: 3 Case 3: 1085 Case 4: 22005 题目大意: 解题思路: 注意:本题数据很大所以不能用数组存值,而用的 map 映射的。 代码如下: import java.math.BigInteger;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class Main{
static Map<BigInteger,BigInteger>dp = new HashMap<BigInteger,BigInteger>();
static BigInteger n,ans;
static int k;
static BigInteger dfs(BigInteger len,BigInteger x){
if(dp.containsKey(len)) return x.multiply(dp.get(len));
if(len.compareTo(BigInteger.valueOf(k))<=0){
return x.multiply(len.subtract(BigInteger.ONE)).multiply(len).divide(BigInteger.valueOf(2));
}
BigInteger tmp = (BigInteger.valueOf(k).subtract(BigInteger.ONE)).multiply((len.subtract(BigInteger.valueOf(k))));
tmp = tmp.add(BigInteger.valueOf(k).multiply(BigInteger.valueOf(k).subtract(BigInteger.ONE)).divide(BigInteger.valueOf(2)));
BigInteger kk = len.mod(BigInteger.valueOf(k));
if(kk!=BigInteger.ZERO){
tmp=tmp.add(dfs(len.divide(BigInteger.valueOf(k)).add(BigInteger.ONE),kk));
}
tmp = tmp.add(dfs(len.divide(BigInteger.valueOf(k)),BigInteger.valueOf(k).subtract(kk)));
dp.put(len,tmp);
return tmp.multiply(x);
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int T = in.nextInt();
for(int cas=1; cas<=T; cas++){
dp.clear();
n = in.nextBigInteger();
k = in.nextInt();
ans=dfs(n,BigInteger.ONE);
System.out.println("Case "+cas+": "+ans);
}
}
}
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |