CS 100: Section Assignment S12

Solutions



import java.io.*;
public class ShowRetailer
{	
	public static void main(String args[])
	{
       TokenReader in = new TokenReader(System.in);
	   
	   // A sample price array.
	   int[][] eg_P = { { 32 , 20 , 22 , 12 , 19 , 17 , 31 , 12} ,
		                { 34 , 22 , 25 , 10 , 13 , 19 , 33 , 15} ,
		                { 34 , 21 , 24 , 13 , 17 , 17 , 34 , 12} };
		     
	   // A sample inventory array.      
	   int[][] eg_I = { { 10 , 20 , 60 , 10 , 40 , 70 , 20 , 10} ,
	                    { 90 , 40 , 80 , 50 , 30 , 40 , 80 , 90} ,
	                    { 30 , 60 , 40 , 30 , 90 , 70 , 30 , 80} };
	                     
	   // Build a store and process three customers.
	   Retailer TallMart = new Retailer(eg_P,eg_I);
	   TallMart.showInv();
	    
	   
	   // Problem 1 Store with the most valuable inventory
	   int maxVal = TallMart.iValue(0);
	   int iBest = 0;
	   for(int i=0;i < eg_I.length;i++)
	   {
	      if(TallMart.iValue(i) > maxVal)
	      {
	         iBest = i;
	         maxVal = TallMart.iValue(i);
	      }
	   }
	   for(int i=0;i < eg_I.length;i++)
	      if(i==iBest)
	         System.out.println(i + " " + TallMart.iValue(i) + " the best");
	      else
	         System.out.println(i + " " + TallMart.iValue(i));
	   
	   // Problem 2 Illustration. Move all item 6's to store 0.
	   TallMart.ShiftInventory(1,0,6);
	   TallMart.ShiftInventory(2,0,6);
	   TallMart.showInv();
	   in.waitUntilEnter();
	}

}

/* Output


  10   20   60   10   40   70   20   10
  90   40   80   50   30   40   80   90
  30   60   40   30   90   70   30   80

0 4850
1 11580 the best
2 8330

  10   20   60   10   40   70  130   10
  90   40   80   50   30   40    0   90
  30   60   40   30   90   70    0   80

*/



public class Retailer
{	
   protected int nStores;     // Number of stores.
   protected int nItems;      // Number of items.
   protected int[][] price;   // Price array: price[i][j] is the price (in dollars) of item j in store i. 
   protected int[][] inv;     // Inventory array: inv[i][j] is the inventory of item j in store i. 
   
   // The Constructor.
   public Retailer(int[][] P, int[][] I)
   // P is the price array and I is the inventory array. They are the same size. The number
   // of stores equals the number of rows and the number of retail items equals the number of columns.
   {
      nStores = P.length;        
      nItems = P[0].length;
      price = copy(P);
      inv   = copy(I);
   }
 
   
   // %%%%%%%Problem 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   
   // Yields the value of  the ith store's inventory
   public int iValue(int i)
   {
      int s = 0;
      for(int j=0;j < nItems;j++)
         s = s + inv[i][j]*price[i][j];
      return s;
   }
   
   
   // %%%%%%%Problem 2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   
   // Depletes to zero store i1's inventory of item j and 
   // increases store i2's inventory of item j by the same amount.
   public void ShiftInventory(int i1, int i2, int j)
   {
       inv[i2][j] = inv[i2][j] + inv[i1][j];
       inv[i1][j] = 0;
   }
       
   // %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
   
   // i satisfies 0 <= i < nStores.
   // PO represents a purchase order. It has length nItems and P0[k] is the
   // quantity of item k that the customer wishes to buy.
   // Yields true if the ith store can handle the purchase order, i.e.,
   // PO[j] <= inv[i][j], j=0,...,nItems-1.
   public boolean iCanDo(int i, int[] PO)
   {
      int j=0;
      while(j < nItems && PO[j]<=inv[i][j])
         j++;
      return (j==nItems);
   }
   
   // i satisfies 0 <= i < nStores.
   // PO represents a purchase order. It has length nItems and P0[j] is the
   // quantity of item j that the customer wishes to buy.
   // Yields the cost of processing the purchase order at store i.
   public int iCost(int i, int[] PO)
   {
      int value = 0;
      for(int j=0;j < nItems;j++)
         value = value + price[i][j]*PO[j];
      return value;
   } 
   
   // PO represents a purchase order. It has length nItems and P0[j] is the
   // quantity of item j that the customer wishes to buy.
   // If no store can process the purchase order then an appropriate message is
   // printed and each store increases its inventory just enough so that it can 
   // process the PO "the next time".
   // Otherwise, the index of the store that can most cheaply fill the PO is printed 
   // along with the minimum cost. The store that processes the order has its inventory
   // depleted accordingly.
   public void processPO(int[] PO)
   {
      int i = 0;
      while (i < nStores && !iCanDo(i,PO))
         i++;
      if (i==nStores)
      {
         // No store has sufficient inventory.
         System.out.println("No single store can process this order at this time.");
         updateInv(PO);
      }
      else
      {
         // Find the store that can most cheaply fill the PO.
         int minCost = iCost(i,PO);
         int bestStore = i;
         for (int s=i+1;s < nStores;s++)
            if (iCanDo(s,PO) && iCost(s,PO) < minCost)
            {
               bestStore = s;
               minCost = iCost(s,PO);
            }
         System.out.println("Price at store " + bestStore + " is " + minCost);
         updateInv(bestStore,PO);
      }
    }
    
    // PO represents a purchase order. It has length nItems and P0[j] is the
    // quantity of item j that the customer wishes to buy. The inventory of every
    // store is increased (if necessary) so that it can just handle the PO.
    public void updateInv(int[] PO)
    {
       for(int i=0;i < nStores;i++)
          for(int j=0;j < nItems;j++)
              if (inv[i][j] < PO[j])
                 inv[i][j] = PO[j];
    }
    
    // i satisfies 0 <= i < nStores
    // PO represents a purchase order. It has length nItems and P0[j] is the
    // quantity of item j that the customer wishes to buy. 
    // The inventory for store i is adjusted to reflect the processing of the PO.
    public void updateInv(int i, int[] PO)
    {
       for(int j=0;j < nItems;j++)
          inv[i][j] = inv[i][j] - PO[j];
    }      
    
    // Displays the inventory array.
    public void showInv()
    {
       System.out.println(" ");
       for(int i=0;i < nStores;i++)
       {
          for(int j=0;j< nItems;j++)
             Format.print(System.out," %3d ",inv[i][j]);
          System.out.println(" ");
       }
       System.out.println(" ");
    }  
    
   // Yields a reference to an array that is an identical copy of A.
   public static int[][] copy(int[][] A)
   {
      int nRows = A.length;
      int nCols = A[0].length;
      int[][] B = new int[nRows][nCols];
      for(int i=0;i < nRows;i++)
         for(int j=0;j < nCols;j++)
            B[i][j] = A[i][j];
      return B;
   }

}

import java.io.*;
public class ShowMailOrder
{	
	public static void main(String args[])
	{
       TokenReader in = new TokenReader(System.in);
	   
	   // A sample price array.
	   int[][] eg_P = { { 32 , 20 , 22 , 12 , 19 , 17 , 31 , 12} ,
		                { 34 , 22 , 25 , 10 , 13 , 19 , 33 , 15} ,
		                { 34 , 21 , 24 , 13 , 17 , 17 , 34 , 12} };
		     
	   // A sample inventory array.      
	   int[][] eg_I = { { 10 , 20 , 60 , 10 , 40 , 70 , 20 , 10} ,
	                    { 90 , 40 , 80 , 50 , 30 , 40 , 80 , 90} ,
	                    { 30 , 60 , 40 , 30 , 90 , 70 , 30 , 80} };
	                    
	   // A sample weight array
	   double[] eg_w = { .10 , .20 , .05 , .15 , .10 , .08 , .07 , .30};
	   
	   // A sample location array
	   double[] eg_x = {30.2 , 7.6 , 48.9};
	   
	   double eg_r = 2.0;
	                     
	   // Build a mail order business and process three customers located at x = 10, 30, and 50.
	   MailOrder TallMart = new MailOrder(eg_P,eg_I,eg_w, eg_x, eg_r);
	   
	   // Problem 3 illustration. %%%%%%%%%%%%%%%%%%%%%%%%
	   
	   int buyAstore = TallMart.buyOut(0,10);
	   System.out.println("To buy store 0 from z = 10 it costs "+ buyAstore);
	   System.out.println(" ");
	   
	   // Problem 4
	   
	   int minShip = TallMart.shipTo(0);
	   int iBest = 0;
	   for(int i=1;i < eg_I.length;i++)
	   {
	      if(TallMart.shipTo(i) < minShip)
	      {
	         iBest = i;
	         minShip = TallMart.shipTo(i);
	      }
	   }
	   for(int i=0;i < eg_I.length;i++)
	      if(i==iBest)
	         System.out.println(i + " " + TallMart.shipTo(i) + " the best");
	      else
	         System.out.println(i + " " + TallMart.shipTo(i));
	   
	   
	   in.waitUntilEnter();
	}

}
/* Output:

To buy store 0 from z = 10 it costs 5799

0 5367 the best
1 6199
2 6436

*/

public class MailOrder extends Retailer
{	
    /* Inherits variables 
    protected int nStores;       // Number of stores.
    protected int nItems;        // Number of items.
    protected int[][] price;     // Price array: price[i][j] is the price (in dollars) of item j in store i. 
    protected int[][] inv;       // Inventory array: inv[i][j] is the inventory of item j in store i.  
    */
    
	protected double[] weight;   // Weight array.   weight[j] is the weight(kg) of item j, j=0,...,nItems-1.
	protected double[] location; // Store locations. The stores are located on the x-axis and for
	                             // i = 0,1,...,nStores-1, location[i] is its x-coordinate (in km).
	protected double   rate;     // Shipping rate. The cost to ship one kg of merchandise one km
	
	                             
	public MailOrder(int[][] P, int[][] I, double[] w, double[] x, double r)
	// P is the price array and I is the inventory array. They are the same size. The number
    // of stores equals the number of rows and the number of retail items equals the number of columns.
    // w is the weight array and x is the location array.
    // 
	{
	   super(P,I);
	   location = copy(x);
	   weight   = copy(w);
	   rate = r;
	}
	
	// Problem 3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	
	// Cost to a customer at z of buying everything in store i.
	public int buyOut(int i,double z) 
	{
	   // Make a purchase order equal to the ith store's inventory.
	   int[] PO = new int[nItems];
	   for(int j=0;j< nItems;j++)
	      PO[j] = inv[i][j];
	   return iCost(i,PO,z);
	}
	
	// Problem 4 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
	
	// Cost of shipping everything in the company to store i.
	public int shipTo(int i)
	{
	   int s = 0;
	   for(int k=0;k < nStores;k++)
	   {
	      if(k!=i)
	      {
	         // "Customer" at ith store has everything in store k shipped.
	         // Shipping cost = (buy out cost) - (value of inventory)
	         s = s + buyOut(k,location[i])-iValue(k);
	      }
	   }
	   return s;
	}
	
	
	
	
	public static double[] copy(double[] a)
	{
	   int n = a.length;
	   double[] b = new double[n];
	   for(int i=0;i < n;i++)
	      b[i] = a[i];
	   return b;
	}
	
   // i satisfies 0 <= i < nStores.
   // PO represents a purchase order. It has length nItems and P0[j] is the
   // quantity of item j that the customer wishes to buy.
   // Yields the cost of processing the purchase order at store i.
   public int iCost(int i, int[] PO, double x)
   {
      // Find the value of the merchandise.
      int value = iCost(i,PO);  
       
      // Determine the total shipping cost.    
      double shippingWeight = 0;
      for(int j=0;j < nItems;j++)
         shippingWeight = shippingWeight + weight[j]*PO[j];
      int shippingCost = (int)(rate*shippingWeight*Math.abs(x-location[i]));
      
      return value + shippingCost;
   } 
   
   // PO represents a purchase order. It has length nItems and P0[j] is the
   // quantity of item j that the customer wishes to buy.
   // If no store can process the purchase order then an appropriate message is
   // printed and each store increases its inventory just enough so that it can 
   // process the PO "the next time".
   // Otherwise, the index of the store that can most cheaply fill the PO is printed 
   // along with the minimum cost. The store that processes the order has its inventory
   // depleted accordingly.
   public void processPO(int[] PO, double x)
   {
      int i = 0;
      while (i < nStores && !iCanDo(i,PO))
         i++;
      if (i==nStores)
      {
         // No store has sufficient inventory.
         System.out.println("No single store can process this order at this time.");
         updateInv(PO);
      }
      else
      {
         // Find the store that can most cheaply fill the PO.
         // NOTE: iCost is overloaded. Java can tell by the signature to use the version
         // above and not the version in the parent class Retailer.
         int minCost = iCost(i,PO,x);
         int bestStore = i;
         for (int s=i+1;s < nStores;s++)
            if (iCanDo(s,PO) && iCost(s,PO,x) < minCost)                                 
            {
               bestStore = s;
               minCost = iCost(s,PO,x);
            }
         System.out.println("Price at store " + bestStore + " is " + minCost);
         updateInv(bestStore,PO);
      }
    }
	

}