2018-11-14, 17:49
  #13
Medlem
Citat:
Ursprungligen postat av kjellbrel
Nu har din main blivit rätt rörig med massor av kod du inte behöver och dessutom läser du inte in tiderna som uppgiften kräver. Den behöver du städa upp och fixa till, men ok, låt oss vänta med det lite.

Du har nu i din array (int[] minutes) all data du behöver för att lösa resten. (Om vi även glömmer för stunden att den är av fix storlek med 3 element, vilket inte heller är ok med uppgiftens krav).

Fokusera nu på att göra en metod till (som redan föreslagits i tråden). Denna räknar ut hur många drawings man kan samla in om man börjar från elev 'ix'. Metoden tar alltså två parametrar: tiderna och vilket index du vill starta från (dvs det 'ix' jag nämnde), samt returnerar hur många drawings som går att samla in.

Du har ju redan i en annan tråd fått bra svar på hur du hanterar indexering när du vill börja om från början av arrayen igen när du hamnar utanför, så använd dig av det.

Sen är det bara att fundera på följande. Vid vilken tidpunkt försöker man hämta den första teckningen? Jämför det värdet med rätt tid i din array (minutes), dvs vid ditt start-index. Vid vilken tidpunkt försöker man hämta den andra? Jämför med motsvarande i din array (dvs start-index + 1), osv. Alla index med cirkulär hantering (dvs, att du måste börja om i din array när du hamnar utanför).

Testkör metoden med fasta startvärden tills du ser att den fungerar. Sen är du nästan i mål. Du har nu en lösning som kan kolla ett av alla möjliga sätt att hämta in drawings. Du behöver alltså köra igenom alla dessa fall och kolla vilket som ger det bästa resultatet, enl uppgiftens krav.

Efter det kan börja rensa i din main (en Scanner räcker bl a), kanske även bryta ut inläsningen av alla tider till en egen metod också. Se till att du läser in data precis som uppgiften kräver, dvs först antal elever (vilket påverkar hur stor array av tider du skall skapa), sen alla tider från nästa input-rad.
Ja koden ser ut såhär nu, tagit bort onödig kod och hoppas det ser bättre ut nu!
Kod:
public class Trääääne {
    public static 
void main(String []args) {
        
Scanner input=new Scanner (System.in);
        
        
System.out.println("Skriv in antal elever..");
        
int elever=input.nextInt();
        
        
int minutes[]=new int [elever];
        
        
System.out.println("lägg till antal minuter för varje student..");
        for(
int i=0;i<minutes.length;i++) {
        
minutes[i]=input.nextInt();    
        }
    
        for(
int i=0;i<minutes.length;i++) {
            
System.out.println(minutes[i]);
        }
    }    



Om detdär är rätt ska jag lägga allt krut på metoden och hoppas jag får till det
Tack för att hjälp mannen
Citera
2018-11-16, 14:15
  #14
Medlem
Okej såhär ser min kod ut för metoden nu!

Nu loopar jag igenom hela arrayn och om någon av de minutrarna i arrayen är 1 eller mindre så är dom teckningarna reviewed. MEN nu har jag då kört fast och behöver hjälp.....Igen....
Den ska ju funka så att jag kollar första värdet vi säger index 0=0 eller 1, ja okej den sprarar vi, sen går till nästa index 1=2 den kommer inte sparas undan för att metoden kollar ju bara 1 och mindre..

Det tar alltid +1 minut för läraren att reviewa tecknigen..
Tex börjar man på student index 0 =0minuter,
student index 2 =1minuter, student index 2 =1minut.

Ganska tjorvigt men har ni läst hela tråden så kanske ni förstår mig! Blev satans luddigt men skriv om ni inte förstår så ska jag försöka bättre haha

Kod:
private static int Samlaindrawings(int [] drawings) {
    
    
int reviewedDrawings 0;
    for(
int i=0;i<drawings.length;i++) 
    {
        if(
drawings[i]<=1)
        {
            
reviewedDrawings++;
        }    
    }
    return 
reviewedDrawings;
  } 
Citera
2018-11-16, 17:47
  #15
Medlem
Citat:
Ursprungligen postat av Douknowme
Okej såhär ser min kod ut för metoden nu!

Nu loopar jag igenom hela arrayn och om någon av de minutrarna i arrayen är 1 eller mindre så är dom teckningarna reviewed. MEN nu har jag då kört fast och behöver hjälp.....Igen....
Den ska ju funka så att jag kollar första värdet vi säger index 0=0 eller 1, ja okej den sprarar vi, sen går till nästa index 1=2 den kommer inte sparas undan för att metoden kollar ju bara 1 och mindre..

Det tar alltid +1 minut för läraren att reviewa tecknigen..
Tex börjar man på student index 0 =0minuter,
student index 2 =1minuter, student index 2 =1minut.

Ganska tjorvigt men har ni läst hela tråden så kanske ni förstår mig! Blev satans luddigt men skriv om ni inte förstår så ska jag försöka bättre haha

Kod:
private static int Samlaindrawings(int [] drawings) {
    
    
int reviewedDrawings 0;
    for(
int i=0;i<drawings.length;i++) 
    {
        if(
drawings[i]<=1)
        {
            
reviewedDrawings++;
        }    
    }
    return 
reviewedDrawings;
  } 

Villkoret för if-satsen ("drawings[i]<=1") behöver du ändra lite på.

Tänk istället att du för varje varv i loopen summerar ihop den totala tiden som läraren ägnat åt att granska arbeten.
När läraren kommer till första eleven har läraren ägnat totalt 0 minuter åt att granska arbeten.
Vid andra eleven har läraren ägnat totalt 1 minut åt att granska arbeten(den första elevens).
Vid tredje eleven har läraren ägnat totalt 2 minuter åt att granska arbeten.
Vid fjärde eleven: totalt 3 minuter. Osv...
Jämför detta med vilka värden for-loopens i-variabel antar för varje varv. Du kan alltså också se i-variabeln som totala antalet minuter läraren ägnat åt att granska arbeten. Dvs, om aktuell elev behöver mindre eller lika mycket tid som läraren (totalt) spenderat åt att granska arbeten så är eleven redan klar...

Lycka till!
__________________
Senast redigerad av fettklumpen 2018-11-16 kl. 18:06.
Citera
2018-11-17, 11:08
  #16
Medlem
Citat:
Ursprungligen postat av fettklumpen
Villkoret för if-satsen ("drawings[i]<=1") behöver du ändra lite på.

Tänk istället att du för varje varv i loopen summerar ihop den totala tiden som läraren ägnat åt att granska arbeten.
När läraren kommer till första eleven har läraren ägnat totalt 0 minuter åt att granska arbeten.
Vid andra eleven har läraren ägnat totalt 1 minut åt att granska arbeten(den första elevens).
Vid tredje eleven har läraren ägnat totalt 2 minuter åt att granska arbeten.
Vid fjärde eleven: totalt 3 minuter. Osv...
Jämför detta med vilka värden for-loopens i-variabel antar för varje varv. Du kan alltså också se i-variabeln som totala antalet minuter läraren ägnat åt att granska arbeten. Dvs, om aktuell elev behöver mindre eller lika mycket tid som läraren (totalt) spenderat åt att granska arbeten så är eleven redan klar...

Lycka till!

Godmorgon! Jo jag kom fram med lösningen på detta vis innan jag kollade på vad ni hade skrivit här..
Och det borde funka på samma sätt! Fan va gött att ha kommit lite längre nu!

Kod:
private static int Samlaindrawings(int [] drawings) {
    
int minuter=1;
    
int reviewedDrawings 0;
    
    for(
int i=0;i<drawings.length;i++) 
    {
        if(
drawings[i]<=minuter)
        {
            
minuter++;
            
reviewedDrawings++;
        }    
    }
    return 
reviewedDrawings;
  } 

Borde väll funka på samma sätt!
Citera
2018-11-17, 12:33
  #17
Medlem
Citat:
Ursprungligen postat av Douknowme
Nej man behöver inte använda trådar!
Jo det kanske jag gör..

Förlåt men hur menar du riktigt? Hur räknar jag ut hur många elever det finns där? Och hur räknar jag ut varje minut som varje elev behöver för att bli klar med ritningen?

Fan de blev många frågor dedär

Använd inte trådar, du har ingen aning vad du gör, det är uppenbart här. Lägg ner trådarna omedelbart, återuppta det vid ett senare tillfälle.

Sedan, har du löst uppgiften matematiskt? det är en algoritm, varför börja koda innan du ens är i närheten av en lösning?

Jag är helt säker på att du kan använda Fenwick tree till detta då jag minns en liknande uppgift för många år sedan.

Läs mer här:

https://www.geeksforgeeks.org/binary...enwick-tree-2/
__________________
Senast redigerad av sampanl 2018-11-17 kl. 13:19.
Citera
2018-11-17, 13:32
  #18
Medlem
kjellbrels avatar
Citat:
Ursprungligen postat av sampanl
Använd inte trådar, du har ingen aning vad du gör, det är uppenbart här. Lägg ner trådarna omedelbart, återuppta det vid ett senare tillfälle.

Sedan, har du löst uppgiften matematiskt? det är en algoritm, varför börja koda innan du ens är i närheten av en lösning?

Jag är helt säker på att du använder Fenwick tree till detta då jag minns en liknande uppgift för många år sedan.

Läs mer här:

https://www.geeksforgeeks.org/binary...enwick-tree-2/
TS är inte redo för den här uppgiften på långa vägar än egentligen. Det har blivit uppenbart efter ett antal PM. Jag har föreslagit ett antal förenklingar samt att först försöka lösa dem för att lära sig och först efter det ta sig an uppgiften. Kämparviljan verkar definitivt finnas, så med enkla tips så kanske TS kommer framåt.
Citera
2018-11-17, 13:39
  #19
Medlem
Citat:
Ursprungligen postat av Douknowme
Godmorgon! Jo jag kom fram med lösningen på detta vis innan jag kollade på vad ni hade skrivit här..
Och det borde funka på samma sätt! Fan va gött att ha kommit lite längre nu!

Kod:
private static int Samlaindrawings(int [] drawings) {
    
int minuter=1;
    
int reviewedDrawings 0;
    
    for(
int i=0;i<drawings.length;i++) 
    {
        if(
drawings[i]<=minuter)
        {
            
minuter++;
            
reviewedDrawings++;
        }    
    }
    return 
reviewedDrawings;
  } 

Borde väll funka på samma sätt!

Från uppgiften:
Kod:
This means that student x gets 0 extra minutes to complete their drawinr,
stund x + 1 gets 1 extra minute student x + 2 gets 2 extra minutes and so on. 
Jag uppfattar det som att första studenten får 0 extra minuter att slutföra sin uppgift, men i din kod initialiserar du "minuter" till 1 vilket innebär att första studenten får 1 extra minut att slutföra sitt arbete.

Vidare från uppgiftsbeskrivningen:
Kod:
NOTE that Meera will still spend 1
minute for each student even if the drawing isn't ready.
Men i din kod har du lagt "minuter++" inuti if-satsen, ökningen bör ju istället ske för varje varv i loopen. (Dvs, läraren spenderar 1 minut med varje elev oberoende av om eleven är klar eller inte.)
__________________
Senast redigerad av fettklumpen 2018-11-17 kl. 13:43.
Citera
2018-11-17, 14:29
  #20
Medlem
Som ett enkelt exempel:

Vi har ett bord med 3 elever som tar 0,1,2 minuter extra på sig

Man kan då undersöka någon form av tidskomplexitet.

[0,1,2] scenario 1.

start ->(-1)0,
(-1)0,
(-1)0,
svar: 3 min

[0,1,2] scenario 2.

(-1)0,
start ->(-2)0,
(-1)0,
svar: 4 min, kom ihåg att läraren går runt bordet, alltså modulus)


[0,1,2] scenario 3.

(-1)0,
(-1)0,
start ->(-3)0,
svar: 5 min


Här ser vi att scenario 1 vinner, i detta fall testar vi det brute force,

Jag är sjukt besviken på din skola som inte lärt ut algoritmer som kan hjälpa eller så har du inte läst på som du skall. Man ger inte bara ut en sådan här uppgift hur som helst.
__________________
Senast redigerad av sampanl 2018-11-17 kl. 14:33.
Citera
2018-11-17, 15:33
  #21
Medlem
För övrigt har min algoritm tidskomplexitet på o(n^2) i bästa fall ....som suger. Detta är ett så kallat brute force alternativ som jag presenterade ovan.
__________________
Senast redigerad av sampanl 2018-11-17 kl. 15:38.
Citera
2018-11-19, 08:47
  #22
Medlem
Citat:
Ursprungligen postat av fettklumpen
Från uppgiften:
Kod:
This means that student x gets 0 extra minutes to complete their drawinr,
stund x + 1 gets 1 extra minute student x + 2 gets 2 extra minutes and so on. 
Jag uppfattar det som att första studenten får 0 extra minuter att slutföra sin uppgift, men i din kod initialiserar du "minuter" till 1 vilket innebär att första studenten får 1 extra minut att slutföra sitt arbete.

Vidare från uppgiftsbeskrivningen:
Kod:
NOTE that Meera will still spend 1
minute for each student even if the drawing isn't ready.
Men i din kod har du lagt "minuter++" inuti if-satsen, ökningen bör ju istället ske för varje varv i loopen. (Dvs, läraren spenderar 1 minut med varje elev oberoende av om eleven är klar eller inte.)

Ja jag har ändrat koden till
Kod:
private static int Samlaindrawings(int [] drawings) {
    
    
int reviewedDrawings 0;
    for(
int i=0;i<drawings.length;i++) 
    {
        if(
drawings[i]<=i)
        {
            
reviewedDrawings++;
        }    
    }
    return 
reviewedDrawings;
  } 

Citera
2018-11-19, 08:51
  #23
Medlem
Citat:
Ursprungligen postat av sampanl
Som ett enkelt exempel:

Vi har ett bord med 3 elever som tar 0,1,2 minuter extra på sig

Man kan då undersöka någon form av tidskomplexitet.

[0,1,2] scenario 1.

start ->(-1)0,
(-1)0,
(-1)0,
svar: 3 min

[0,1,2] scenario 2.

(-1)0,
start ->(-2)0,
(-1)0,
svar: 4 min, kom ihåg att läraren går runt bordet, alltså modulus)


[0,1,2] scenario 3.

(-1)0,
(-1)0,
start ->(-3)0,
svar: 5 min


Här ser vi att scenario 1 vinner, i detta fall testar vi det brute force,

Jag är sjukt besviken på din skola som inte lärt ut algoritmer som kan hjälpa eller så har du inte läst på som du skall. Man ger inte bara ut en sådan här uppgift hur som helst.

Yes mmh jag förstår till viss del! Och har börjat med en metod som ser ut på detta vis

Kod:
public static void main(String []args) {
    
Scanner input=new Scanner (System.in);
    
    
//Mata in 5st
    
System.out.println("Skriv in antal elever..");
    
int elever=input.nextInt();
    
    
int minuter[]=new int [elever];
    
    
System.out.println("lägg till antal minuter för varje student..");
    for(
int i=0;i<minuter.length;i++) {
    
minuter[i]=input.nextInt();    
    }

    
System.out.println("Insamlade ritningar:"+Samlaindrawings(minuter));

}

private static 
int Samlaindrawings(int [] drawings) {
    
    
int reviewedDrawings 0;
    for(
int i=0;i<drawings.length;i++) 
    {
        if(
drawings[i]<=i)
        {
            
reviewedDrawings++;
        }    
    }
    return 
reviewedDrawings;
  } 

Vet att jag måste ha in ett startIndex också och föra in det i loopen och använda mig av modulus.. Det jag håller på klura på nu! på metoden då alltså

Tack för all hjälp och läraren sa vi ska klura på detta själva, förvisso har jag redan lämnat in uppgiften men vill göra klart för jag vill lära mig detta. Tycker det är väldigt intressant
__________________
Senast redigerad av Douknowme 2018-11-19 kl. 08:56.
Citera
2018-11-19, 16:52
  #24
Medlem
Citat:
Ursprungligen postat av Douknowme
Yes mmh jag förstår till viss del! Och har börjat med en metod som ser ut på detta vis

Kod:
public static void main(String []args) {
    
Scanner input=new Scanner (System.in);
    
    
//Mata in 5st
    
System.out.println("Skriv in antal elever..");
    
int elever=input.nextInt();
    
    
int minuter[]=new int [elever];
    
    
System.out.println("lägg till antal minuter för varje student..");
    for(
int i=0;i<minuter.length;i++) {
    
minuter[i]=input.nextInt();    
    }

    
System.out.println("Insamlade ritningar:"+Samlaindrawings(minuter));

}

private static 
int Samlaindrawings(int [] drawings) {
    
    
int reviewedDrawings 0;
    for(
int i=0;i<drawings.length;i++) 
    {
        if(
drawings[i]<=i)
        {
            
reviewedDrawings++;
        }    
    }
    return 
reviewedDrawings;
  } 

Vet att jag måste ha in ett startIndex också och föra in det i loopen och använda mig av modulus.. Det jag håller på klura på nu! på metoden då alltså

Tack för all hjälp och läraren sa vi ska klura på detta själva, förvisso har jag redan lämnat in uppgiften men vill göra klart för jag vill lära mig detta. Tycker det är väldigt intressant

Studerar du på universitet? Följer du någon form av universitetsprogram ? Ingenjör/datateknik?
Citera

Skapa ett konto eller logga in för att kommentera

Du måste vara medlem för att kunna kommentera

Skapa ett konto

Det är enkelt att registrera ett nytt konto

Bli medlem

Logga in

Har du redan ett konto? Logga in här

Logga in