17 svar
133 visningar
erze7811 102
Postad: 3 jan 2023 14:11

kattis seven wonders

Jag jobbar på en uppgift där man får poäng utifrån hur många kort man har av ett slag, programmet jag har gjort hittils räknar ut antal poäng men inte med de extra 7 poängen man får om man har ett av varje, eller 2 av varje osv. Det är det jag inte kommer på hur jag ska göra för att räkna ut det

#include <stdio.h>
#include <string.h>
#include <math.h>

int main() {
    int i = 0;
    int t = 0, c = 0, g = 0;
    char text[50] = {0};
    fgets(text, 50, stdin);
    for(i = 0; i < strlen(text); i++) {
        if(text[i] == 'T') {
            t++;
        }
        if(text[i] == 'C') {
            c++;
        }
        if(text[i] == 'G') {
            g++;
        }  
    }
    int poang = pow(t,2) + pow(c,2) + pow(g,2);
    printf("%d\n", poang);
    
    
    return 0;
}

 

 

Laguna Online 30708
Postad: 3 jan 2023 16:44

Jag bara testar förståelsen för uppgiften. Om t = 3, c = 5 och g = 4, hur många extrapoäng får man då?

erze7811 102
Postad: 3 jan 2023 16:55

Då blir det 7x3, alltså 21 extra poäng. Finns 3 par av alla då eller vad man ska säga

Laguna Online 30708
Postad: 3 jan 2023 18:18

OK. Så givet 3, 5 och 4 så är antalet fullständiga uppsättningar (med en av varje grej) 3. Kan du se vad det är för funktion som du behöver?

erze7811 102
Postad: 3 jan 2023 18:41

Nej, allt som står i bilderna är all information om uppgiften.

Jag testade att få fram det minsta talet av de 3 och sedan i totala poängen göra poäng = (t *t) + (c *c) + (g *g) + (min *7) och det klarade alla de där sample outputs men inte alla test cases.

#include <stdio.h>
#include <string.h>


int main() {
    int i = 0;
    int t = 0, c = 0, g = 0;
    int min = 0;
    char text[50] = {0};
    fgets(text, 50, stdin);
    for(i = 0; i < strlen(text); i++) {
        if(text[i] == 'T') {
            t++;
        }
        if(text[i] == 'C') {
            c++;
        }
        if(text[i] == 'G') {
            g++;
        }  
    }
    if(t < c && t < g)
        min = t;
    else if( c < t && c < g)
        min = c;
    else 
        min = g;
    
    int poang = (t * t) + (c * c) + (g * g) +(min *7);
    printf("%d\n", poang);
    
    
    return 0;
}
Laguna Online 30708
Postad: 3 jan 2023 18:56

Ja, det var just minimum som jag menade. Det är ett sätt att räkna ut det.

Får du veta något om testfallen som inte fungerade?

erze7811 102
Postad: 3 jan 2023 19:13

Tror inte det, ser ut såhär:

Laguna Online 30708
Postad: 3 jan 2023 19:27

Vad händer i din minimum-beräkning om c = t?

erze7811 102
Postad: 3 jan 2023 20:06

g blir minsta?

Laguna Online 30708
Postad: 3 jan 2023 20:33

Mm, och om g inte är den minsta då?

erze7811 102
Postad: 3 jan 2023 20:35

då blir poängen inte korrekt. men hur ska jag fixa det? ändra till <= i if satserna?

Laguna Online 30708
Postad: 3 jan 2023 20:43

Ja, det är ett sätt.

erze7811 102
Postad: 3 jan 2023 20:55

Klarade fortfarande inte alla testcases

Laguna Online 30708
Postad: 3 jan 2023 21:02

Hmm. Men gick det bättre?


Tillägg: 3 jan 2023 21:06

De kanske har varit elaka och haft 50 bokstäver på en rad. Då får de inte plats. Avslutande nyrad ska få plats och ett Nul-tecken också. Gör plats för 52 tecken.

 

erze7811 102
Postad: 3 jan 2023 21:38

Kan testa, skrev in TTCCGGG och fick alltså 31 poäng vilket blir rätt 2*2+2*2+3*3+2*7.

erze7811 102
Postad: 3 jan 2023 21:41

Tack, nu fungerade det, men varför 52 tecken och borde inte 51 räcka med eftersom det sista är väl '\0'?

Laguna Online 30708
Postad: 3 jan 2023 21:57

Radavslutningen '\n' är där också.

Doff 61
Postad: 11 jan 2023 10:31

 

 

Gör som erze7811 men det som han missar är dels logiken på uträkningen av "min".

T C G T<C &&T<G C<T && C<G Resultat
1 1 2 0 && 1 =0 0 && 1 =0 Min =2 som är fel(min=g)

 

Han skrev lite fel på uträkningen.

int poang = (t * t) + (c * c) + (g * g) +(min *7);

skulle vara

int poang = pow(t,2) + pow(c,2) + pow(g,2)+ (min *7);

 

Detta borde fungera men testa ordentligt.

 if(t <= c && t <= g)
    min = t;
 else if( c <= t && c <= g)
    min = c;
 else if( g <= t && g <= c)
    min = g;
    
 int poang = (pow(t,2)) + pow(t,2) + pow(g,2) +(min *7);
Svara
Close