Tävlingsprogrammering/Uppgifter/Receptet

Från Wikibooks


Receptet

Du har bestämt dig för att laga mat. För att laga maten behöver du N ingredienser. För varje ingrediens vet du hur mycket du redan har hemma, hur mycket du behöver totalt samt kostnaden för ingrediensen om du måste köpa den. Du skall alltså köpa den mängd av varje ingrediens som du saknar. Uppgiften är att beräkna kostnaden för att laga maten. Det kommer inte finnas mer än 5 ingredienser.

Programmet ska fråga efter antalet ingredienser och sedan för varje ingrediens hur mycket du redan har hemma, hur mycket du behöver totalt samt hur mycket den kostar (per enhet) om du måste köpa den. Programmet ska skriva ut den totala kostnaden.

Körningsexempel 1:

Antal ingredienser ? 3
Nr 1: Hur mycket har du ? 10
Nr 1: Hur mycket behövs ? 5
Nr 1: Vad kostar den ? 1000
Nr 2: Hur mycket har du ? 0
Nr 2: Hur mycket behövs ? 4
Nr 2: Vad kostar den ? 5
Nr 3: Hur mycket har du ? 2
Nr 3: Hur mycket behövs ? 5
Nr 3: Vad kostar den ? 1
Total kostnad: 23

Förklaring: Den första ingrediensen som är väldigt dyr har du lyckligtvis redan tillräckligt av. Den andra ingrediensen får du köpa 4 stycken av för 5 kr styck. Den sista ingrediensen köper du endast 3 av, för du har redan 2 och behöver 5, de kostar endast 1 kr styck. Totalt blir notan 23 kr.

Lösning[redigera]

Uppgiften är ganska rättfram utan några klurigheter.

Lösning i Java.

import java.util.*;

public class Receptet
{
	public static void main(String [] klein)
	{
		Scanner scan = new Scanner(System.in);

		System.out.print("Antal ingredienser ? ");
		int N = scan.nextInt();

		//Den totala kostnaden.
		int svar = 0;

		for(int i = 1; i<=N; i++)
		{
			System.out.print("Nr "+i+": Hur mycket har du ? ");
			int have = scan.nextInt();

			System.out.print("Nr "+i+": Hur mycket behövs ? ");
			int need = scan.nextInt();

			System.out.print("Nr "+i+": Vad kostar den ? ");
			int cost = scan.nextInt();
			
			//Har vi mindre än vad vi behöver måste vi köpa (need-have) enheter.
			if(have<need) svar += (need-have)*cost;
		}

		//Skriver ut svaret.
		System.out.println("\nTotal kostnad: " + svar);
	}
}

Motsvarande lösning, fast i Haskell.

-- Receptet
module Main where
import Control.Monad

getInt :: IO Int
getInt = getLine >>= return.read

main = do 
	putStr "Antal ingredienser ? "
	n <- getInt
	
	svar <- forM [1..n] (\x -> do
		putStr $ "Nr " ++ show x ++ ": Hur mycket har du ? "
		have <- getInt
		putStr $ "Nr " ++ show x ++ ": Hur mycket behovs ? "
		need <- getInt
		putStr $ "Nr " ++ show x ++ ": Vad kostar den ? "
		cost <- getInt
		return $ if have<need then (need-have)*cost else 0)
		
	putStrLn.("\nTotal kostnad: " ++).show $ sum svar