Sinulla on vesiastiat, joiden tilavuudet ovat a ja b litraa, ja tavoitteesi on mitata x litraa vettä astioiden avulla.
Astiat ovat aluksi tyhjiä, eikä niissä ole mitta-asteikkoa. Joka askeleella saat täyttää tai tyhjentää jommankumman astian tai kaataa vettä astioiden välillä. Kuitenkin joka askeleella ainakin toisen astioista on täytyttävä tai tyhjennyttävä kokonaan, koska muuten mittaus ei olisi tarkka.
Mikä on pienin mahdollinen siirrettävän veden kokonaismäärä, jolla saat mitattua x litraa vettä ensimmäiseen astiaan? Esimerkiksi kun a=5, b=4 ja x=2, pienin siirtomäärä on 22 litraa. Tässä on yksi optimaalinen ratkaisu:
- Täytä ensimmäinen astia (vettä siirtyy 5 litraa)
- Kaada ensimmäisestä astiasta toinen astia täyteen (vettä siirtyy 4 litraa)
- Tyhjennä toinen astia (vettä siirtyy 4 litraa)`
- Kaada ensimmäisen astian sisältö toiseen astiaan (vettä siirtyy 1 litraa)`
- Täytä ensimmäinen astia (vettä siirtyy 5 litraa)`
- Kaada ensimmäisestä astiasta toinen astia täyteen (vettä siirtyy 3 litraa)`
Voit olettaa, että 1 \le a,b \le 500 ja 1 \le x \le a. Jos mitään ratkaisua ei ole olemassa, haluttu vastaus on -1.
Python
Toteuta tiedostoon water.py
funktio count
, joka kertoo pienimmän mahdollisen siirrettävän veden kokonaismäärän.
def count(a,b,x): # TODO if __name__ == "__main__": print(count(5,4,2)) # 22 print(count(4,3,2)) # 16 print(count(3,3,1)) # -1 print(count(10,9,8)) # 46 print(count(123,456,42)) # 10530
Java
Toteuta tiedostoon Water.java
metodi count
, joka kertoo pienimmän mahdollisen siirrettävän veden kokonaismäärän.
import java.util.*; public class Water { public int count(int a, int b, int x) { // TODO } public static void main(String[] args) { Water w = new Water(); System.out.println(w.count(5,4,2)); // 22 System.out.println(w.count(4,3,2)); // 16 System.out.println(w.count(3,3,1)); // -1 System.out.println(w.count(10,9,8)); // 46 System.out.println(w.count(123,456,42)); // 10530 } }