題目描述
過年啦!小B高興的不行了,她收到了很多紅包,可以實現好多的愿望呢。小B可是對商店貨架上心儀的貨物紅眼好久了,只因囊中羞澀作罷,這次她可是要大大的shopping一番。小B想去購物時,總是習慣性的把要買的東西列在一個購買清單上,每個物品單獨列一行(即便要買多個某種物品),這次也不例外。
小B早早的來到了商店,由于她太激動,以至于她到達商店的時候,服務員還沒有把各個商品的價簽排好,所有的價簽還都在柜臺上。因此還需要一段時間,等服務器把價簽放到對應的商品處,小B才能弄清她的購買清單所需的費用。
小B都有些迫不及待了,她希望你能夠根據購買清單,幫她算算最好和最壞的情況下所需的費用,你能幫她嗎?
輸入
輸入中有多組測試數據。每組測試數據的第一行為兩個整數n和m(1=<n, m=<1000),分別表示價簽的數量以及小B的購買清單中所列的物品數。第二行為空格分隔的n個正整數,表示貨架上各類物品的價格,每個數的大小不超過100000。隨后的m行為購買清單中物品的名稱,所有物品名稱為非空的不超過32個拉丁字母構成的字符串,保證清單中不同的物品種類數不超過n,且商店有小B想要購買的所有物品。
樣例輸入
5 3
4 2 1 10 5
apple
orange
mango
6 5
3 5 1 6 8 1
peach
grapefruit
banana
orange
orange
輸出
對每組測試數據,在單獨的行中輸出兩個數a和b,表示購買清單上所有的物品可能需要的最小和最大費用。
樣例輸出
7 19
11 30
import java.util.*;
public class Main {
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
while(sc.hasNext()){
int n=sc.nextInt();
int m=sc.nextInt();
int[] a=new int[n];
for(int i = 0; i < n; i++){
a[i]=sc.nextInt();
}
Arrays.sort(a);
Map<String,Integer> map=new HashMap<String,Integer>();
int k=1;
for(int i = 0; i < m; i++){
String s2=sc.next();
if(map.containsKey(s2)){
int d=map.get(s2);
map.put(s2,++d );
}else{
map.put(s2, k);
}
}
Set<String> set=map.keySet();
int[] num=new int[map.size()];
int t=0;
for(String key:set){
int value=map.get(key);
num[t]=value;
t++;
}
Arrays.sort(num);
int min=0;
int max=0;
int start=0;
int end=n-1;
for(int i=map.size()-1;i>=0;i--){
min+=num[i]*a[start];
start++;
max+=num[i]*a[end];
end--;
}
System.out.println(min+" "+max);
}
}
}