水模拟,注意以下几个条件就可以了。
1、格子数只有6个,如果当格子满了就不可以买东西了,即使格子里面有consume物品也不能买相同的consume物品,但是可以合成物品,但是不能合成不需要合成物的物品(因为格子已经满了,放不下了)
2、一件mixture的价格是该物品的初始价格+合成组件的价格,这里我在代码中是先用DFS来得到所有mixture物品的价格
3、每次只能卖一件normal或mixture物品,但是consume物品被卖时是一个格子里的全部被卖掉,卖物品的价钱等于物品的原价
4、When a mixture equipment is get, the mixture equipment of recipe in you backpack will disappear.
5、 If one operation is illegal, there is nothing happened in your backpack and gold.
6、注意合成物品时可能需要的某种物品的个数是0个,Format: str num: str1 num1, str2 num2, ... , strn numn (num1 + num2 + … +numn<=6 and numi >= 0 (1 <= i <= n)),注意numi=0的时候
7、当金币不够的时候是不可以买东西的
源码如下,比较长
import java.util.*; public class Main { /** * @by xkey */ public static Map<String,Integer>mixValue; public static int dfs(Map<Map<String,Integer>,List<Map<String,Integer>>> mixMap, Map<String,Integer>key,Map<String,Integer>map1){ Iterator ss = key.entrySet().iterator(); String key1 = ""; while(ss.hasNext()){ Map.Entry entry2 = (Map.Entry) ss.next(); key1 = (String)entry2.getKey(); } Iterator mixItr = mixMap.entrySet().iterator(); Map<String,Integer> getKey = new HashMap<String,Integer>(); while(mixItr.hasNext()){ boolean flag = false; Map.Entry en = (Map.Entry) mixItr.next(); Map<String,Integer> findKey = (Map<String,Integer>)en.getKey(); Iterator kk = findKey.entrySet().iterator(); String mixString = ""; int mixValue2 = 0; while(kk.hasNext()){ Map.Entry ent = (Map.Entry)kk.next(); mixString = (String)ent.getKey(); mixValue2 = (Integer)ent.getValue(); if(mixString.equals(key1) == true){ flag = true; getKey = findKey; break; } } if(flag == true){ break; } } List<Map<String,Integer>> val = (List<Map<String,Integer>>)mixMap.get(getKey); Iterator tt = getKey.entrySet().iterator(); int value = 0; while(tt.hasNext()){ Map.Entry entry2 = (Map.Entry) tt.next(); value = (Integer)entry2.getValue(); } if(val.size() == 0){ if(mixValue.containsKey(key1)){ int v = mixValue.get(key1); mixValue.put(key1, v+value); }else{ mixValue.put(key1, value); } return mixValue.get(key1); }else{ Iterator<Map<String,Integer>> itrea = val.iterator(); int totalValue = 0; totalValue += value; if(val.size() == 0){ mixValue.put(key1, totalValue); }else{ while(itrea.hasNext()){ Map<String,Integer> xkey = itrea.next(); Iterator xkeyItr = xkey.entrySet().iterator(); String xkeyStr2 = ""; int xkeyVal = 0; while(xkeyItr.hasNext()){ Map.Entry entry2 = (Map.Entry) xkeyItr.next(); xkeyStr2 = (String)entry2.getKey(); xkeyVal = (Integer)entry2.getValue(); } if(map1.containsKey(xkeyStr2)){ totalValue += xkeyVal * map1.get(xkeyStr2); }else{ if(mixValue.containsKey(xkeyStr2)){ totalValue += xkeyVal * mixValue.get(xkeyStr2); }else{ totalValue += xkeyVal * dfs(mixMap,xkey,map1); } } } if(mixValue.containsKey(key1)){ int v = mixValue.get(key1); mixValue.put(key1, v+totalValue); }else{ mixValue.put(key1, totalValue); } } return mixValue.get(key1); //mixValue.put(key1,totalValue); } } public static void main(String[] args) { Scanner cin = new Scanner(System.in); int n1,n2,n3,m,num,cnt=0; while(cin.hasNext()){ cnt++; String [] mix = new String[100]; String [] mix2 = new String[100]; n1 = cin.nextInt(); String str; String mixture1,mixture2; Map<String,Integer>map1 = new HashMap<String,Integer>(); mixValue = new HashMap<String,Integer>(); Map<Map<String,Integer>,List<Map<String,Integer>>> mixMap = new HashMap<Map<String,Integer>,List<Map<String,Integer>>>(); Map<String,Integer> map4 = new HashMap<String,Integer>(); Map<String,Integer> own1 = new HashMap<String,Integer>(); Map<String,Integer> own2 = new HashMap<String,Integer>(); int grid1 = 0; for(int i = 0 ; i < n1 ; i ++){ str = cin.next(); num = cin.nextInt(); map1.put(str,num); } Iterator itr1 = map1.entrySet().iterator(); n2 = cin.nextInt(); cin.nextLine(); for(int i = 0 ; i < n2 ; i ++){ str = cin.nextLine(); mix = str.split(": "); Map<String,Integer>map2 = new HashMap<String,Integer>(); if(mix.length >= 2){ mixture1 = mix[0]; mixture2 = mix[1]; mix = mixture1.split(" "); map2.put(mix[0], Integer.parseInt(mix[1])); mix = mixture2.split(", "); List<Map<String,Integer>> mixList = new ArrayList<Map<String,Integer>>(); for(int j = 0 ; j < mix.length ; j ++){ mix2 = mix[j].split(" "); Map<String,Integer>map3 = new HashMap<String,Integer>(); map3.put(mix2[0], Integer.parseInt(mix2[1])); mixList.add(map3); } mixMap.put(map2, mixList); } else{ mixture1 = mix[0]; List<Map<String,Integer>> mixList = new ArrayList<Map<String,Integer>>(); mix = mixture1.split(" "); map2.put(mix[0], Integer.parseInt(mix[1])); mixMap.put(map2, mixList); } } Iterator mixItr = mixMap.entrySet().iterator(); while(mixItr.hasNext()){ Map.Entry entry = (Map.Entry) mixItr.next(); Map<String,Integer> key = (Map<String,Integer>)entry.getKey(); List<Map<String,Integer>> val = (List<Map<String,Integer>>)entry.getValue(); Iterator kk = key.entrySet().iterator(); String mixString = ""; int mixValue2 = 0; while(kk.hasNext()){ Map.Entry en = (Map.Entry)kk.next(); mixString = (String)en.getKey(); mixValue2 = (Integer)en.getValue(); } Iterator<Map<String,Integer>> itrea = val.iterator(); int totalValue = 0; totalValue += mixValue2; if(val.size() == 0){ mixValue.put(mixString, totalValue); } else{ while(itrea.hasNext()){ Map<String,Integer> xkey = itrea.next(); Iterator xkeyItr = xkey.entrySet().iterator(); String xkeyStr = ""; int xkeyVal = 0; while(xkeyItr.hasNext()){ Map.Entry entry2 = (Map.Entry) xkeyItr.next(); xkeyStr = (String)entry2.getKey(); xkeyVal = (Integer)entry2.getValue(); } if(map1.containsKey(xkeyStr)){ totalValue += xkeyVal * map1.get(xkeyStr); }else{ if(mixValue.containsKey(xkeyStr)){ totalValue += xkeyVal * mixValue.get(xkeyStr); }else{ //xkey can't be find -> dfs int tempValue = dfs(mixMap,xkey,map1); totalValue += xkeyVal * tempValue; } } mixValue.put(mixString,totalValue); } } } // Iterator valItr = mixValue.entrySet().iterator(); // System.out.println(mixValue.size()); // while(valItr.hasNext()){ // Map.Entry entry = (Map.Entry)valItr.next(); // System.out.println("mixValue "+entry.getKey()+" "+entry.getValue()); // } Iterator itr2 = mixMap.entrySet().iterator(); n3 = cin.nextInt(); for(int i = 0 ; i < n3 ; i ++){ str = cin.next(); num = cin.nextInt(); map4.put(str, num); } Iterator itr4 = map4.entrySet().iterator(); int gold = 0; m = cin.nextInt(); for(int i = 0 ; i < m ; i ++){ str = cin.next(); String temp = str.substring(1); if(str.charAt(0) == '+'){ if(str.charAt(1) >= '0' && str.charAt(1) <= '9'){ gold += Integer.valueOf(temp); }else{ if(map1.containsKey(temp) && grid1 < 6){ int value = map1.get(temp); if(value <= gold){ gold -= value; if(own1.containsKey(temp)){ num = own1.get(temp); own1.put(temp, num+1); }else{ own1.put(temp, 1); } grid1 ++; } } //consume else if(map4.containsKey(temp) && grid1 < 6){ int value = map4.get(temp); if(value <= gold){ gold -= value; if(own1.containsKey(temp)){ num = own1.get(temp); own1.put(temp, num+1); }else{ own1.put(temp, 1); grid1++; } } }else{ //check mixMap must be have,and it can be got boolean flag = false; Map<String,Integer> key = new HashMap<String,Integer>(); List<Map<String,Integer>> val = new ArrayList<Map<String,Integer>>(); Iterator keyItr2 = mixMap.entrySet().iterator(); while(keyItr2.hasNext()){ Map.Entry entry = (Map.Entry) keyItr2.next(); key = (Map<String,Integer>) entry.getKey(); val = (List<Map<String,Integer>>)entry.getValue(); if(key.containsKey(temp)){ flag = true; break; } } //mixMap if(flag == true){ //get value int value = 0; if(key.containsKey(temp)){ value = key.get(temp); } //check boolean allhave = true; boolean empty = false; if(val.size() == 0) { allhave = true; empty = true; }else{ empty = false; Iterator<Map<String,Integer>> it = val.iterator(); while(it.hasNext()){ boolean flag1 = false; boolean flag2 = false; Map<String,Integer>find = it.next(); Iterator itr = find.entrySet().iterator(); String key1=""; int val1=0; while(itr.hasNext()){ Map.Entry entry = (Map.Entry) itr.next(); key1 = (String)entry.getKey(); val1 = (Integer)entry.getValue(); } //check normal if(val1 == 0){ if(map1.containsKey(key1)){ flag1 = true; }else{ flag2 = true; } }else{ if(own1.containsKey(key1)){ num = own1.get(key1); if(val1 <= num) flag1 = true; } //check mixture else if(own2.containsKey(key1)){ num = own2.get(key1); if(val1 <= num) flag2 = true; } } if(flag1 == false && flag2 == false){ allhave = false; } } } //check if(allhave == true && empty == true && grid1 < 6){ if(value <= gold){ gold -= value; if(own2.containsKey(temp)){ num = own2.get(temp); own2.put(temp, num+1); }else{ own2.put(temp, 1); } grid1++; } } else if(allhave == true && empty == false && grid1 <= 6){ if(value <= gold){ gold -= value; if(own2.containsKey(temp)){ num = own2.get(temp); own2.put(temp, num+1); }else{ own2.put(temp, 1); } grid1++; //remove synthesis Iterator<Map<String,Integer>> it2 = val.iterator(); while(it2.hasNext()){ Map<String,Integer>find = it2.next(); Iterator itr = find.entrySet().iterator(); String key1=""; int val1=0; while(itr.hasNext()){ Map.Entry entry = (Map.Entry) itr.next(); key1 = (String)entry.getKey(); val1 = (Integer)entry.getValue(); } if(own1.containsKey(key1)){ grid1 -= val1; num = own1.get(key1); //remove num -= val1; if(num <= 0) own1.remove(key1); else{ own1.put(key1, num); } } else if(own2.containsKey(key1)){ grid1 -= val1; num = own2.get(key1); num -= val1; if(num <= 0) own2.remove(key1); else{ own2.put(key1, num); } } } } } } } } } //sell else{ //normal if(map1.containsKey(temp) && own1.containsKey(temp)){ grid1--; gold += map1.get(temp); num = own1.get(temp); //remove if(num == 1) own1.remove(temp); else{ num --; own1.put(temp, num); } } //mixture else if(own2.containsKey(temp)){ grid1--; //exist boolean flag = false; Iterator rem = mixMap.entrySet().iterator(); Map<String,Integer> key = new HashMap<String,Integer>(); List<Map<String,Integer>> val = new ArrayList<Map<String,Integer>>(); while(rem.hasNext()){ Map.Entry entry = (Map.Entry) rem.next(); key = (Map<String,Integer>) entry.getKey(); val = (List<Map<String,Integer>>)entry.getValue(); if(key.containsKey(temp)){ flag = true; break; } } int value = 0; if(flag == true){ //get value if(mixValue.containsKey(temp)) gold += mixValue.get(temp); num = own2.get(temp); if(num == 1) own2.remove(temp); else{ num --; own2.put(temp, num); } } } //consume else if(map4.containsKey(temp)&&own1.containsKey(temp)){ grid1--; num = own1.get(temp); int value = map4.get(temp) * num; gold += value; own1.remove(temp); } } } System.out.println("Case "+cnt+":"); System.out.println(gold); System.out.println(grid1); List<String>strList = new ArrayList<String>(); Map<String,Integer> ans = new HashMap<String,Integer>(); if(own1.size() != 0){ Iterator res1 = own1.entrySet().iterator(); while(res1.hasNext()){ Map.Entry entry = (Map.Entry) res1.next(); String key = (String)entry.getKey(); Integer val = (Integer)entry.getValue(); ans.put(key, val); strList.add(key); } } if(own2.size() != 0){ Iterator res2 = own2.entrySet().iterator(); while(res2.hasNext()){ Map.Entry entry = (Map.Entry) res2.next(); String key = (String)entry.getKey(); Integer val = (Integer)entry.getValue(); strList.add(key); ans.put(key, val); } } Collections.sort(strList, new Comparator<String>() { public int compare(String a, String b) { return a.compareTo(b); } }); Iterator<String> it = strList.iterator(); while(it.hasNext()){ String resStr = it.next(); Integer value = ans.get(resStr); if(map4.containsKey(resStr)){ System.out.println(resStr+": "+value); }else{ for(int j = 0 ; j < value ; j ++){ System.out.println(resStr+": 1"); } } } System.out.println(); } } }