Diamond and Ruby - Pocket Gems prepare


https://www.1point3acres.com/bbs/thread-217589-1-1.html
You’re playing your favorite RPG, and your character has just found a room full of treasure. You have n inventory slots. Luckily, objects of the same type stack together, with the maximum size of the stack depending on the type (e.g. coins might stack to 10, diamonds to 5, armor to 1, etc.). Each stack (or partial stack) takes up 1 inventory slot. Each item has a selling value (e.g. a single diamond might be worth 10, so a stack of 5 diamonds would be worth 50). You want to maximize the total selling value of the items in your inventory.



  1. class Tuple{
  2.     String name;
  3.     int value;
  4.     int maximum_stack_size;
  5.     public Tuple(String name, int value, int maximum_stack_size){
  6.         this.name = name;
  7.         this.value = value;
  8.         this.maximum_stack_size = maximum_stack_size;
  9.     }
  10. }

  11. public class Main {

  12.     public static int maxValue(int n, String[] items, Tuple[] item_infos){
  13.         int val = 0;
  14.         HashMap<String, Integer> maxMap = new HashMap<>();
  15.         HashMap<String, Integer> valMap = new HashMap<>();
  16.         HashMap<String, Integer> countMap = new HashMap<>();
  17.         for (Tuple item_info : item_infos){
  18.             maxMap.put(item_info.name, item_info.maximum_stack_size);
  19.             valMap.put(item_info.name, item_info.value);
  20.         }
  21.         for(String item : items){
  22.             countMap.put(item, countMap.getOrDefault(item, 0) + 1);
  23.         }
  24.         for(int i = 0; i < n && !countMap.isEmpty(); i++){
  25.             int max = 0;
  26.             String select = "";
  27.             int num = 0;
  28.             for (String item : countMap.keySet()){
  29.                 int count = countMap.get(item);
  30.                 if(count >= maxMap.get(item)){
  31.                     if(maxMap.get(item) * valMap.get(item) > max) {
  32.                         select = item;
  33.                         num = maxMap.get(item);
  34.                         max = maxMap.get(item) * valMap.get(item);
  35.                     }
  36.                 }
  37.                 else{
  38.                     if (count * valMap.get(item) > max){
  39.                         select = item;
  40.                         num = count;
  41.                         max = count * valMap.get(item);. From 1point 3acres bbs
  42.                     }
  43.                 }
  44.             }
  45.             val += max;
  46.             if(!select.equals("")){
  47.                 countMap.put(select, countMap.get(select) - num);. 1point3acres
  48.                 if (countMap.get(select) == 0){
  49.                     countMap.remove(select);
  50.                 }. 1point3acres
  51.             }. From 1point 3acres bbs
  52.         }
  53.         return val;
  54.     }


我的理解是,对于每个item,可以用总的个数除以一个stack最多能放的个数,得到放满的stack个数,并算这些stack的value,并且丢到heap里面,然后再算余数对应stack的value,丢到heap里去,最后取top k...我不明白的事....这么算复杂度真的有优化么?假设k很小,item很多...岂不是做了很多没必要的维护堆的操作?sift up/sift down

突然想到heap的优化了, 你的code复杂度是O(k*n), 相对于每个slot, worst case要遍历整个items(或余下的)一遍. 而heap的做法,复杂度是O(nlog(k)),只用遍历一遍, 然后存入一个大小为k的heap就完事了. 不知道我的想法有没有道理.

  1. public static int maxValue(int n, String[] stuff, item[] items ){
  2.         Map<String, Integer> cntMap = new HashMap<String,Integer>();
  3.         for(String s:stuff){
  4.             cntMap.put(s,cntMap.getOrDefault(s,0)+1);
  5.         }
  6.         PriorityQueue<Integer> maxHeap = 
  7.                          new PriorityQueue<>((x,y)->(y-x));
  8.         Map<String, item> itemMap = new HashMap<String, item>();
  9.         for(item i: items){
  10.             itemMap.put(i.name, i);
  11.         }
  12.         
  13.         for(String key: cntMap.keySet()){
  14.             int amt = cntMap.get(key);
  15.             int maxStack = itemMap.get(key).max_stack;
  16.             int value = itemMap.get(key).value;. check 1point3acres for more.
  17.             if(amt>maxStack){
  18.                 maxHeap.add(value*maxStack);. From 1point 3acres bbs
  19.                 maxHeap.add(value*(amt-maxStack));
  20.             }else{
  21.                 maxHeap.add(value*amt);
  22.             }
  23.             
  24.         }
  25.         int t=0, rlt = 0;-baidu 1point3acres
  26.         while(t<n){
  27.             rlt+=maxHeap.poll();
  28.             t++;
  29.         }
  30.         return rlt;
  31.         . 1point3acres
  32.     }
http://www.cnblogs.com/EdwardLiu/p/6423891.html
说我有一个背包,有n个格子,一个格子可以放5个钻石,一个钻石10块钱,一个格子可以放5个ruby,一个ruby 5块钱, 一个格子可以放一个装备,一个装备25块钱。
然后给你n个钻石n个ruby n个装备,求最大化收益。
类似Ones and Zeroes
Dp[i][j][k] = Max(dp[i-5][j][k] + 5*10,    dp[i][j-5][k] + 5*5,    dp[i][j][k-1] + 1*25)
reduce了dimension,其实还有一个维度是前k个格子,直接用倒序省掉了这个维度
 7     public static int maxProfit(int n, int a, int b, int c) {
 8         int[][][] dp = new int[a+1][b+1][c+1];
 9         for (int l=1; l<=n; l++) {
10             for (int i=a; i>=0; i--) {
11                 for (int j=b; j>=0; j--) {
12                     for (int k=c; k>=0; k--) {
13                         if (i >= 5) dp[i][j][k] = Math.max(dp[i][j][k], dp[i-5][j][k] + 5*10);
14                         if (j >= 5) dp[i][j][k] = Math.max(dp[i][j][k], dp[i][j-5][k] + 5*5);
15                         if (k >= 1) dp[i][j][k] = Math.max(dp[i][j][k], dp[i][j][k-1] + 1*25);
16                     }
17                 }
18             }
19         }
20         return dp[a][b][c];
21     }

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts