水模拟,注意以下几个条件就可以了。

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 -> dfsint 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 ++;}}//consumeelse 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 gotboolean 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;}}//mixMapif(flag == true){//get valueint value = 0;if(key.containsKey(temp)){value = key.get(temp);}//checkboolean 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 normalif(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 mixtureelse if(own2.containsKey(key1)){num = own2.get(key1);if(val1 <= num)flag2 = true;}}if(flag1 == false && flag2 == false){allhave = false;}}}//checkif(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 synthesisIterator<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);//removenum -= 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);}}}}}}}}}//sellelse{//normalif(map1.containsKey(temp) && own1.containsKey(temp)){grid1--;gold += map1.get(temp);num = own1.get(temp);//removeif(num == 1) own1.remove(temp);else{ num --;own1.put(temp, num);}}//mixtureelse if(own2.containsKey(temp)){grid1--;//existboolean 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 valueif(mixValue.containsKey(temp))gold += mixValue.get(temp);num = own2.get(temp);if(num == 1) own2.remove(temp);else{num --;own2.put(temp, num);}}}//consumeelse 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();}}}

HDU 4269 Defend Jian Ge 解题报告相关推荐

  1. hdu 1312 Red and Black 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 第二条深搜,题目并不难,但是做了我好久好久,由于一个细节,让我赌上了一个晚上的时间. 题目大意: ...

  2. hdu 1022 Train Problem I 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1022 其实是一道上数据结构课讲过的例题  只不过当时讲的是怎么用手算  一道水题又花了好长时间 其实就 ...

  3. HDU 4383 To The Moon 解题报告

    HDU 4383 To The Moon 题意翻译 已知一个长为\(n\)的序列\(a\),你需要进行下面的四种操作. C l r d 将区间\([l,r]\)中的数加上\(d\),同时时间加\(1\ ...

  4. hdu 2049 不容易系列之(4)——考新郎 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2049 写这篇解题报告时 我真的很气愤 对自己又一次犯下低级错误改了两个小时 int型的数据居然用%I6 ...

  5. hdu 2058 解题报告 - The sum problem

    hdu 2058 解题报告 - The sum problem 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2058 等差求和公式: Sn=(a1+aN ...

  6. 解题报告(四)生成函数(ACM/ OI)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

  7. 解题报告 (十三) 尺取法

    文章目录 尺取法 解题报告 PKU 2100 Graveyard Design PKU 3061 Subsequence PKU 2739 Sum of Consecutive Prime Numbe ...

  8. 解题报告 (十四) 数位DP

    文章目录 数位DP 解题报告 HDU 4722 Good Numbers HDU 2089 不要62 HDU 3555 Bomb HDU 3652 B-number PKU 3252 Round Nu ...

  9. HDU7191 Count Set 解题报告

    HDU7191 Count Set 解题报告 题目链接 题目大意 n n n 个数构成排列 p i ( 1 ≤ i ≤ n ) p_i(1\le i\le n) pi​(1≤i≤n),计算基数为 k ...

  10. 解题报告(十八)数论题目泛做(Codeforces 难度:2000 ~ 3000 + )

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...

最新文章

  1. hadoop0.20.0第一个例子
  2. 【转】.NET程序内存分析工具CLRProfiler的使用
  3. 在lighttpd上使用fastcgi方式部署hg server
  4. 【C语言】判断某一正整数是否为完数
  5. 计算机能考四川司法学院吗,四川司法警官职业学院计算机文化基础课程在线考试系统...
  6. java怎么实现有消息时显示红点_Android中的红点提示怎么统一实现?
  7. mysql如何从两个表取出内容_如何从mysql中的两个表中获取数据?
  8. java彩票开奖程序_用java 实现彩票摇奖,猜拳程序
  9. 【愚公系列】2022年10月 微信小程序-电商项目-收货地址功能实现
  10. 一文看懂网卡驱动原理及移植方法
  11. ANSYS or Abaqus? 一个过来人的工作感悟
  12. 我的并行计算之路(二)MPI点对点通信MPI_Send和MPI_Recv
  13. easypoi导出多个Excel压缩zip下载
  14. Spring框架知识
  15. 海润光伏88亿交易陷“罗生门”
  16. 喜大普奔——Mapbox GL JS支持多种投影了
  17. 批处理禁用、启用USB设备如此简单
  18. 视频转码后,video只能播放声音,不能播放画面
  19. 我的世界在线服务器地址,我的世界1.7.2服务器ip_我的世界1.7.2服务器地址大全_好特教程...
  20. 数据库顶会VLDB论文解读:阿里数据库智能参数优化的创新与实践

热门文章

  1. 纯前端集成视频会议和聊天室
  2. 疫情持续两年多职场妈妈更努力存钱,近六成中国内地受访者储蓄可维持生活一年以上...
  3. mysql 统计市县的数量
  4. 基金投资入门 4:指数基金
  5. ps动作储存覆盖原文件的原因
  6. Java+HTML预习笔记_20140610
  7. 第一个开源小软件二维码批量生成工具
  8. 南京、无锡、苏州三地部分it岗待遇简况
  9. 360顽固木马专杀工具 千万别用 会删除Oracle服务
  10. 网银--U盾等--支付宝等总结