HDU 4269 Defend Jian Ge 解题报告
水模拟,注意以下几个条件就可以了。
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 解题报告相关推荐
- hdu 1312 Red and Black 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 第二条深搜,题目并不难,但是做了我好久好久,由于一个细节,让我赌上了一个晚上的时间. 题目大意: ...
- hdu 1022 Train Problem I 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1022 其实是一道上数据结构课讲过的例题 只不过当时讲的是怎么用手算 一道水题又花了好长时间 其实就 ...
- HDU 4383 To The Moon 解题报告
HDU 4383 To The Moon 题意翻译 已知一个长为\(n\)的序列\(a\),你需要进行下面的四种操作. C l r d 将区间\([l,r]\)中的数加上\(d\),同时时间加\(1\ ...
- hdu 2049 不容易系列之(4)——考新郎 解题报告
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2049 写这篇解题报告时 我真的很气愤 对自己又一次犯下低级错误改了两个小时 int型的数据居然用%I6 ...
- hdu 2058 解题报告 - The sum problem
hdu 2058 解题报告 - The sum problem 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2058 等差求和公式: Sn=(a1+aN ...
- 解题报告(四)生成函数(ACM/ OI)
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...
- 解题报告 (十三) 尺取法
文章目录 尺取法 解题报告 PKU 2100 Graveyard Design PKU 3061 Subsequence PKU 2739 Sum of Consecutive Prime Numbe ...
- 解题报告 (十四) 数位DP
文章目录 数位DP 解题报告 HDU 4722 Good Numbers HDU 2089 不要62 HDU 3555 Bomb HDU 3652 B-number PKU 3252 Round Nu ...
- 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 ...
- 解题报告(十八)数论题目泛做(Codeforces 难度:2000 ~ 3000 + )
整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量的题解和代码,题目难度不一 ...
最新文章
- hadoop0.20.0第一个例子
- 【转】.NET程序内存分析工具CLRProfiler的使用
- 在lighttpd上使用fastcgi方式部署hg server
- 【C语言】判断某一正整数是否为完数
- 计算机能考四川司法学院吗,四川司法警官职业学院计算机文化基础课程在线考试系统...
- java怎么实现有消息时显示红点_Android中的红点提示怎么统一实现?
- mysql如何从两个表取出内容_如何从mysql中的两个表中获取数据?
- java彩票开奖程序_用java 实现彩票摇奖,猜拳程序
- 【愚公系列】2022年10月 微信小程序-电商项目-收货地址功能实现
- 一文看懂网卡驱动原理及移植方法
- ANSYS or Abaqus? 一个过来人的工作感悟
- 我的并行计算之路(二)MPI点对点通信MPI_Send和MPI_Recv
- easypoi导出多个Excel压缩zip下载
- Spring框架知识
- 海润光伏88亿交易陷“罗生门”
- 喜大普奔——Mapbox GL JS支持多种投影了
- 批处理禁用、启用USB设备如此简单
- 视频转码后,video只能播放声音,不能播放画面
- 我的世界在线服务器地址,我的世界1.7.2服务器ip_我的世界1.7.2服务器地址大全_好特教程...
- 数据库顶会VLDB论文解读:阿里数据库智能参数优化的创新与实践