• 1
  • 2
2018-11-09, 08:48
  #1
Medlem
Hej! Som rubriken lyder så har jag problem med en uppgift jag har i skolan.
Suttit och läst igenom den hundra tals gånger men kommer ändå inte fram till någon lösning.
Tänkte om de finns någon här som kan hjälpa mig på tråden
Tack på förhand!

Jag skriver uppgiften innanför html tagg så kanske man ser det lättare

HTML-kod:
Meera teaches a class of n students, and every day in her classroom is an adventure. Today it drawing day! 

The students are sitting around a round table, and they are numbered from 1 to n in the clockwise direction.
This means that the students are numbered 1,2,3,...,n-1,n, and students 1 and n are sitting next to each other.

After letting the  students draw for a certain perdiof of time. Meera starts collecting their work to ensure
she has the time to review all the drawings before the end of the day. However, some of her students are't 
finished drawing! Each student _i needs _ti extra minutes to complete their drawing. 

Meera collects the drawings squentially in the clockwise direction, starting with studen ID x, and it takes her
exactly 1 minute to review each drawing. 
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. NOTE that Meera will still spend 1
minute for each student even if the drawing isn't ready.

Given the values t1,t2,....,tN, help Meera choose the best possible X to start colleting drawings from,
such that number of students able to complete their drawings in maximal. Then print x on a new line.
if there are multiple such IDs, select the smallest one.


INPUT FORMAT

The first line contains a single positive integer, n, denoting the number of students in the class.
The secound line containts n space-separated integers describing the respective amounts of time that each student
needs to finish their drawins (i.e.,t1,t2,...,tn).

CONSTRAINTS
* 1<n<10*10*10*10*10 (Det ska vara 10 upphöjt med 5 men gick ej att skriva)
*0<ti<n


OUTPUT FORMAT

Print an integer denoting the ID number, x, where Meera should start collecting the drawings such that
a maximal number of students can complete their drawings. If there are multiple such IDs, sekect the smallest one.

SAMPLE INPUT

3
1 0 0 

SAMPLE OUTPUT

2




EXPLANATION

Meera's class has n=3 students:

1.if x=1, the only two students will finish.
 The first student needs t1=1 extra minute to complete their drawing. if Meera starts collecting here, this 
student will never finish their drawing. Students 2 and 3s drawings are already finished, so their drawings are
ready when she collects them in the secound and this minutes.


2.if x=2, then all three stundets will finish.
The secound student needs t2=0 extra minutes, so the drawing is ready for Meera to collect. The next (third)
student's drawing is also ready one minute later, as t3=0. Meera then proceeds ti the next (first) student, who
needed t1= 1 extra minute. Because she already spent two minutes collecting the work of the other two students,
the first stundent's drawing has already been completed for 2 - 1 = 1 minute. 

3.if x=3, then all three students will finish.
The third student needs t3 = 0 extra minutes, so the drawing is ready for Meera to collect. The next(first)
student's drawing is also ready one minute laater, as t1=1 and 1 minute passed while Meera collected the 
third student's drawing. She then proceeds to the next (secound) student, whose drawing was already completed
(as t2=0)

Stating with student IDs x=2 or x=3 will result in a maximum number of competed drawings (i.e.,3) Because 
there are two equally valid aswers, we choose the smalled ID, 2, and print it as our answer.


public class Solution {

    public static void main(String [] args) {
      /* Enter your code here. Read input from STDIN. Print output to STDOUT. Your class should be named Solution. */

}


}
Citera
2018-11-09, 11:55
  #2
Medlem
fittslickarns avatar
Du kanske kan visa hur långt du kommit med kodandet eller tror du att vi skall lösa din skoluppgift?
Citera
2018-11-09, 12:01
  #3
Medlem
Citat:
Ursprungligen postat av fittslickarn
Du kanske kan visa hur långt du kommit med kodandet eller tror du att vi skall lösa din skoluppgift?
hahaha nädå brush, jag trodde inte det. Jag chansade på att någon kunde försöka ge sig på den samtidigt som jag gjorde det. Sen då jag var klar skulle jag gå in och kolla om någon hade skrivit

Men vet ej om jag missuppfattat helt dock..

Kod:
public class Solution {

    public static 
void main(String []argsthrows InterruptedException {
        
        
//Tre studenter i en array med olike ID
        
int studentID[]= {1,2,3};
        
        
//Skapar tre trådar med varsin student
        
Thread stud1=new Thread(new Tuna("First student"));
        
Thread stud2=new Thread(new Tuna("Secound student"));
        
Thread stud3=new Thread(new Tuna("Third student"));
        
        
System.out.println("Time is out.. time for review");
        
        
//Startar trådarna
        
stud2.start();  
        
Thread.sleep(11000);//Tiden att gå till nästa student 
        
stud3.start();
        
Thread.sleep(11000);
        
stud1.start();
        
Thread.sleep(11000);
      
        
System.out.printf("\nStart with student number %s  Meera..",studentID[1]);
        
//Två rätta svar, id 2 och 3 men printar ut lägsta id 
    
}
        


Kod:
public class Tuna implements Runnable {
    
String name;
    
    public 
Tuna(String xthrows InterruptedException {
      
name=x;
      }
    
    public 
void run () {
        try {
            
System.out.printf("\n%s:s drawing gets reviewed for one minute..\n",name);
            
Thread.sleep(10000);//Vi fantiserar att det är en minut
            
System.out.printf("%s:s drawing has been collected!\n",name);
        }catch(
Exception e) {}
    }
    

Citera
2018-11-09, 14:42
  #4
Medlem
Citat:
Ursprungligen postat av Douknowme
hahaha nädå brush, jag trodde inte det. Jag chansade på att någon kunde försöka ge sig på den samtidigt som jag gjorde det. Sen då jag var klar skulle jag gå in och kolla om någon hade skrivit

Men vet ej om jag missuppfattat helt dock..
...

Är det krav på att uppgiften ska lösas med trådar?

Du kanske gör det onödigt svårt för dig själv?

Detta kan man väl räkna ut rent matematiskt utan att utföra beräkningar i realtid med trådar?

Det enklaste (och naiva) sättet är väl att räkna ut antal betygsatta för alla möjliga kombinationer (startpositioner) och sedan välja resultatet med flest betygsatta elever (och lägst index).
__________________
Senast redigerad av fettklumpen 2018-11-09 kl. 14:58.
Citera
2018-11-09, 15:34
  #5
Medlem
Citat:
Ursprungligen postat av fettklumpen
Är det krav på att uppgiften ska lösas med trådar?

Du kanske gör det onödigt svårt för dig själv?

Detta kan man väl räkna ut rent matematiskt utan att utföra beräkningar i realtid med trådar?

Det enklaste (och naiva) sättet är väl att räkna ut antal betygsatta för alla möjliga kombinationer (startpositioner) och sedan välja resultatet med flest betygsatta elever (och lägst index).

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
Citera
2018-11-09, 16:08
  #6
Medlem
kjellbrels avatar
Citat:
Ursprungligen postat av Douknowme
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?
Det skall du inte göra. Kolla vad som sägs under "input" i uppgiften.

Citat:
Ursprungligen postat av Douknowme
Fan de blev många frågor dedär
Ta en sak i taget. Se till att ditt program kan läsa in antal elever och respektive elevs tidsåtgång som uppgiften kräver först och testa att det funkar.

Efter det kan du fundera vidare på hur du skall lösa detta. Som redan nämnts så behöver du inte skapa trådar för detta. Det är ett ganska enkelt statistiksamlande program du behöver göra.

En detalj med de inputkrav som angavs. Gissar att det blev lite fel där? Inte förväntas du väl kunna hantera en klass med 10k elever och dessutom vid testkörning mata in 10k tidsvärden? Bäst att du checkar med originalet igen.
Citera
2018-11-09, 17:22
  #7
Medlem
Citat:
Ursprungligen postat av kjellbrel
Det skall du inte göra. Kolla vad som sägs under "input" i uppgiften.


Ta en sak i taget. Se till att ditt program kan läsa in antal elever och respektive elevs tidsåtgång som uppgiften kräver först och testa att det funkar.

Efter det kan du fundera vidare på hur du skall lösa detta. Som redan nämnts så behöver du inte skapa trådar för detta. Det är ett ganska enkelt statistiksamlande program du behöver göra.

En detalj med de inputkrav som angavs. Gissar att det blev lite fel där? Inte förväntas du väl kunna hantera en klass med 10k elever och dessutom vid testkörning mata in 10k tidsvärden? Bäst att du checkar med originalet igen.


Men hur vet jag hur många elever den ska läsa in och respektive tid? Är det bara något jag får välja själv?
Och ja så står de i uppgiften!
Det jag inte förstår är dehär

the first line contains a sinle positive integer... den biten

CONSTRAINTS

1<n<10upphöjt med 5

0<ti<n

Kan ni förklara hur det menas?


Är jag fel ute om jag skapar en array av Studenter och array av tid för varje student
och skapar en scanner där man får skriva in värderna? Tänkte att då läser jag ju in Elever och tider!
__________________
Senast redigerad av Douknowme 2018-11-09 kl. 18:15.
Citera
2018-11-09, 21:17
  #8
Medlem
Citat:
Ursprungligen postat av Douknowme
Men hur vet jag hur många elever den ska läsa in och respektive tid? Är det bara något jag får välja själv?
Och ja så står de i uppgiften!
Det jag inte förstår är dehär

the first line contains a sinle positive integer... den biten

CONSTRAINTS

1<n<10upphöjt med 5

0<ti<n

Kan ni förklara hur det menas?


Är jag fel ute om jag skapar en array av Studenter och array av tid för varje student
och skapar en scanner där man får skriva in värderna? Tänkte att då läser jag ju in Elever och tider!

Så här uppfattar jag det:
Första raden berättar hur många studenter det finns.
Andra raden berättar hur många minuter varje student behöver för att slutföra sitt arbete.

Exempelvis:
Kod:
5
3 5 2 5 1
Ovanstående innebär: Första raden säger att vi har 5 studenter. På andra raden finns det därför 5 tal som säger oss:
Första studenten behöver 3 minuter för att slutföra sitt arbete.
Andra studenten behöver 5 minuter för att slutföra sitt arbete.
Tredje studenten behöver 2 minuter för att slutföra sitt arbete.
Fjärde studenten behöver 5 minuter för att slutföra sitt arbete.
Femte studenten behöver 1 minut för att slutföra sitt arbete.

Dvs, använd dig av Scanner och läs in det första heltalet (antal studenter) och spara undan det i en variabel. Skapa sen en array av heltal vars storlek bestäms av talet du nyss läste in. Därefter anropar du scanner i en loop för att läsa in talen på andra raden och placera dessa i heltals-arrayen.

När du är klar kommer heltals-arrayen (låt oss kalla den "students") innehålla tidsbehovet för varje student. "students[0]" berättar hur många minuter första studenten behöver för att slutföra sitt arbete, "students[1]" berättar hur många minuter den andre studenten behöver för att slutföra sitt arbete... osv. För mitt exempel ovan skulle "students.length" vara 5 och "students[0]" innehålla 3, "students[1]" innehålla 5, "students[2]" innehålla 2... osv.

Därefter kan det nog vara en god idé att skapa en hjälpmetod i stil med:
Kod:
private static int reviewAllDrawings(int startIndex, int[] students) {
    // ...
}
Metoden returnerar antal slutförda arbeten om läraren börjar kontrollera den n:te eleven (som bestäms av parametern "startIndex"). Tänk på att studenterna sitter i en cirkel så du bör nog hantera arrayen "students" som det vore en cirkulär buffert inuti metoden.

Sen är det bara att anropa "reviewAllDrawings()" i en loop för varje index i "students"-arrayen. Håll reda på det lägsta index för den startposition som ger flest slutförda arbeten. Klart!

...så har iallafall jag uppfattat uppgiften, kanske är det helt fel, du bör självklart dubbelkolla med din handledare, det är deras uppgift att vägleda er.

Lycka till!
Citera
2018-11-10, 11:41
  #9
Medlem
Citat:
Ursprungligen postat av fettklumpen
Så här uppfattar jag det:
Första raden berättar hur många studenter det finns.
Andra raden berättar hur många minuter varje student behöver för att slutföra sitt arbete.

Exempelvis:
Kod:
5
3 5 2 5 1
Ovanstående innebär: Första raden säger att vi har 5 studenter. På andra raden finns det därför 5 tal som säger oss:
Första studenten behöver 3 minuter för att slutföra sitt arbete.
Andra studenten behöver 5 minuter för att slutföra sitt arbete.
Tredje studenten behöver 2 minuter för att slutföra sitt arbete.
Fjärde studenten behöver 5 minuter för att slutföra sitt arbete.
Femte studenten behöver 1 minut för att slutföra sitt arbete.

Dvs, använd dig av Scanner och läs in det första heltalet (antal studenter) och spara undan det i en variabel. Skapa sen en array av heltal vars storlek bestäms av talet du nyss läste in. Därefter anropar du scanner i en loop för att läsa in talen på andra raden och placera dessa i heltals-arrayen.

När du är klar kommer heltals-arrayen (låt oss kalla den "students") innehålla tidsbehovet för varje student. "students[0]" berättar hur många minuter första studenten behöver för att slutföra sitt arbete, "students[1]" berättar hur många minuter den andre studenten behöver för att slutföra sitt arbete... osv. För mitt exempel ovan skulle "students.length" vara 5 och "students[0]" innehålla 3, "students[1]" innehålla 5, "students[2]" innehålla 2... osv.

Därefter kan det nog vara en god idé att skapa en hjälpmetod i stil med:
Kod:
private static int reviewAllDrawings(int startIndex, int[] students) {
    // ...
}
Metoden returnerar antal slutförda arbeten om läraren börjar kontrollera den n:te eleven (som bestäms av parametern "startIndex"). Tänk på att studenterna sitter i en cirkel så du bör nog hantera arrayen "students" som det vore en cirkulär buffert inuti metoden.

Sen är det bara att anropa "reviewAllDrawings()" i en loop för varje index i "students"-arrayen. Håll reda på det lägsta index för den startposition som ger flest slutförda arbeten. Klart!

...så har iallafall jag uppfattat uppgiften, kanske är det helt fel, du bör självklart dubbelkolla med din handledare, det är deras uppgift att vägleda er.

Lycka till!


Tack du är suverän! Ska nog lösa det nu!
Citera
2018-11-10, 11:55
  #10
Medlem
kjellbrels avatar
Citat:
Ursprungligen postat av Douknowme
Men hur vet jag hur många elever den ska läsa in och respektive tid? Är det bara något jag får välja själv?

Föregående postare har väl gett dig en bra förklaring av detta nu?

Dessutom har du ett tydligt exempel även i uppgiften, som anger 3 elever och deras tre tidsvärden, samt förklarar samtliga beräkningsfall steg för steg med just de förutsättningarna. Så här får du rejält med hjälp hur du skall lösa uppgiften.

Citat:
Ursprungligen postat av Douknowme
Det jag inte förstår är dehär

the first line contains a sinle positive integer... den biten

CONSTRAINTS

1<n<10upphöjt med 5

0<ti<n

Kan ni förklara hur det menas?

Tanken är säkerligen att du skall träna på att hantera rimlig input. Angivna constraints anger gränserna för vilka värden programmet skall acceptera.

Men jag tror det blivit fel någonstans i uppgiftstexten du postat. Det är helt enkelt orimligt att programmet skall acceptera att man som input anger 99999 elever. Då behöver man på nästa rad skriva in lika många tidsvärden.

Om ex kravet för antal elever (ne) ser ut så här:

0 < ne < a

så testar du helt enkelt det efter att ha läst in första radens värde:

Kod:
if (ne <= 0 || ne >= a) {  
    // bad input, tell user and quit
}

Citat:
Ursprungligen postat av Douknowme
Är jag fel ute om jag skapar en array av Studenter och array av tid för varje student och skapar en scanner där man får skriva in värdena? Tänkte att då läser jag ju in Elever och tider!
En array med tider lär du ju uppenbart behöva, men fundera lite på om du behöver en array med studenter. Vad skall den användas till?
Citera
2018-11-14, 13:50
  #11
Medlem
Citat:
Ursprungligen postat av kjellbrel
Föregående postare har väl gett dig en bra förklaring av detta nu?

Dessutom har du ett tydligt exempel även i uppgiften, som anger 3 elever och deras tre tidsvärden, samt förklarar samtliga beräkningsfall steg för steg med just de förutsättningarna. Så här får du rejält med hjälp hur du skall lösa uppgiften.


Tanken är säkerligen att du skall träna på att hantera rimlig input. Angivna constraints anger gränserna för vilka värden programmet skall acceptera.

Men jag tror det blivit fel någonstans i uppgiftstexten du postat. Det är helt enkelt orimligt att programmet skall acceptera att man som input anger 99999 elever. Då behöver man på nästa rad skriva in lika många tidsvärden.

Om ex kravet för antal elever (ne) ser ut så här:

0 < ne < a

så testar du helt enkelt det efter att ha läst in första radens värde:

Kod:
if (ne <= 0 || ne >= a) {  
    // bad input, tell user and quit
}


En array med tider lär du ju uppenbart behöva, men fundera lite på om du behöver en array med studenter. Vad skall den användas till?

Jag har kommit såhär långt nu

Kod:
public class Trääääne {
    public static 
void main(String []args) {
        
Scanner input=new Scanner (System.in);
        
Scanner inputs=new Scanner (System.in);
        
        
String students[]=new String [3];
        
        
System.out.println("Lägg till studenter i listan");
        for(
int i=0;i<students.length;i++) {
            
students[i]=inputs.nextLine();
        }
        
        
int minutes[]=new int [3];
        
        
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<students.length;i++) {
            
System.out.println(students[i]+" behöver - "+minutes[i]+" minuter för att bli klar..");        
        }        
        
        
        
    }    
    
     private static 
void reviewDrawing(int startIndexint [] students) { 
         }     
        } 

OUTPUT
Kod:
Lägg till studenter i listan
x
y
z
lägg till antal minuter för varje student
..
2
0
1
x behöver 
2 minuter för att bli klar..
y behöver 0 minuter för att bli klar..
z behöver 1 minuter för att bli klar.. 

Men det jag kört fast med är jag vill ha en metod som returnerar antal hur många som ritat klart och antalet som inte ritat klart (om så är fallet)
Men somsagt har jag totalt kört fast på det.
__________________
Senast redigerad av Douknowme 2018-11-14 kl. 13:53.
Citera
2018-11-14, 14:40
  #12
Medlem
kjellbrels avatar
Citat:
Ursprungligen postat av Douknowme
Jag har kommit såhär långt nu

Kod:
public class Trääääne {
    public static 
void main(String []args) {
        
Scanner input=new Scanner (System.in);
        
Scanner inputs=new Scanner (System.in);
        
        
String students[]=new String [3];
        
        
System.out.println("Lägg till studenter i listan");
        for(
int i=0;i<students.length;i++) {
            
students[i]=inputs.nextLine();
        }
        
        
int minutes[]=new int [3];
        
        
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<students.length;i++) {
            
System.out.println(students[i]+" behöver - "+minutes[i]+" minuter för att bli klar..");        
        }        
        
        
        
    }    
    
     private static 
void reviewDrawing(int startIndexint [] students) { 
         }     
        } 

OUTPUT
Kod:
Lägg till studenter i listan
x
y
z
lägg till antal minuter för varje student
..
2
0
1
x behöver 
2 minuter för att bli klar..
y behöver 0 minuter för att bli klar..
z behöver 1 minuter för att bli klar.. 

Men det jag kört fast med är jag vill ha en metod som returnerar antal hur många som ritat klart och antalet som inte ritat klart (om så är fallet)
Men somsagt har jag totalt kört fast på det.
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.
__________________
Senast redigerad av kjellbrel 2018-11-14 kl. 14:43.
Citera
  • 1
  • 2

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