Tävlingsprogrammering/Uppgifter/Lampor

Från Wikibooks

Lampor

Användningen av glödlampor är på väg att avskaffas inom EU, men redan nu kan det löna sig att använda lågenergilampor. Du ska skriva ett program som, givet hur mycket en lampa är tänd varje dag samt elpriset, beräknar efter hur många dagar totalkostnaden (inköp av lampor + elkostnad) för första gången är lägre för lågenergilampan än för glödlampan.

Vi antar följande data:

GlödlampaLågenergilampa
Effekt (W) 60 11
Livslängd (timmar) 1000 8000
Inköpspris (kronor) 5 60

För enkelhets skull antar vi att alla exemplar har exakt den givna livslängden. Detta innebär alltså att för att ha lampan tänd i 1000 timmar räcker det att köpa en glödlampa, men för att ha den tänd i 1001 timmar måste man köpa ytterligare en glödlampa eftersom den första går sönder efter 1000 timmar. Elkostnaden K för att ha lampan tänd i H timmar kan beräknas med formeln

K = E · H · P /100000

där E är lampans effekt i W och P är elpriset i öre/kWh. I samtliga testfall kommer endast en lågenergilampa att behöva köpas (lågenergi blir alltså billigast redan innan man behöver byta lågenergilampan).

Körningsexempel:

Timmar tänd per dag ? 7 
Elpris ? 98 
Lågenergi billigast efter 149 dagar. 

Kommentar: Efter 149 dagar är kostnaden med glödlampor 71.32840 kronor (varav inköpskostnad 10 kronor; man måste byta glödlampa en gång) och med lågenergilampa 71.24354 kronor (varav inköpskostnad 60 kronor).

Lösning[redigera]

Man räknar helt enkelt ut kostnaden för båda typerna dag efter dag. Man måste särskilt vara noga med vad som händer vid 1000 timmar så att man inte köper ny glödlampa en dag för tidigt eller sent.

#include <stdio.h>

int GE=60, LE=11;
int GL=1000, LL=8000;
int GP=5, LP=60;

int main() {
  int h,p,d,gp,lp;
  printf("Timmar tänd per dag ?");
  scanf("%d", &h);
  printf("Elpris ?");
  scanf("%d", &p);
  for(d=1;d<=LL;d++) {
      gp=GE*d*h*p+((d*h-1)/GL+1)*GP*100000;
      lp=LE*d*h*p+((d*h-1)/LL+1)*LP*100000;
      if(lp<=gp) break;
  }
  printf("Lågenergi billigast efter %d dagar.\n", d);
  return 0;
 }

Lösningsexempel i Java.

import java.util.*;

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

		//Våra fakta. Effekt, livslängd och inköpspris.
		final int E1 = 60, E2 = 11;
		final int LIFE1 = 1000, LIFE2 = 8000;
		final int BUY1 = 5, BUY2 = 60;

		System.out.print("Timmar tänd per dag: ");
		final int H = scan.nextInt();

		System.out.print("Elpris: ");
		final int P = scan.nextInt();

		//Kostnaden för vardera lampa. Vi börjar med att köpa en av vardera.
		float K1 = BUY1, K2 = BUY2;

		//Hur många dagar som gått.
		int dag = 0;

		//Hur många timmar den nuvarande lampan för vardera varit tänd.
		int hours1 = 0, hours2 = 0;

		//Håller på tills lågenergi är billigare.
		while(K2>K1)
		{
			//Ökar kostnaden för respektive lampa.
			//Vi delar med 100000f så att vi får ett decimaltal och inte 0.
			K1 += E1*H*P/100000f;
			K2 += E2*H*P/100000f;

			//Ökar antalet timmar vardera lampa varit tänd.
			hours1 += H;
			hours2 += H;

			//Om glödlampan paserat sin livslängd.
			if(hours1>LIFE1)
			{
				//Köper ny lampa.
				K1 += BUY1;

				//"Börjar om" att räkna timmar.
				hours1 -= LIFE1;
			}

			//Egentligen onödigt, men det känns schysst
			// att göra detsamma för lågenergilampan.
			if(hours2>LIFE2)
			{
				K2 += BUY2;
				hours2 -= LIFE2;
			}

			//En dag har passerat.
			dag++;
		}

		//Skriver ut svaret.
		System.out.println("Lågenergi billigast efter " + dag + " dagar.");
	}
}


Lösningsexempel i Haskell som ger huvudbry.

-- Lampor
module Main where
import IO
import Data.List

main = do {
	putStr "Timmar tand per dag ? ";
	hours <- getLine;
	
	putStr "Elpris ? ";
	pris <- getLine;
	
	putStrLn $ "Lagenergi billigast efter " ++ (show $ dagar (read hours) (read pris)) ++ " dagar."
}

dagar :: Float -> Float -> Int
dagar h p = 1 + (length $ takeWhile (\(a,b) -> a>b) $ zip (tail lag) (glod 1000.0 5.0))
	where
	lag = 60.0:(map (+ 11.0*h*p/100000.0) lag)
	glod life pris	| rm<0 = (cost + 5.0):(glod (1000.0+rm) (cost+5.0))
			| otherwise = cost:(glod rm cost)
		where
		rm = life - h
		cost = (pris+60.0*h*p/100000.0)