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;
}
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å?
Då blir det 7x3, alltså 21 extra poäng. Finns 3 par av alla då eller vad man ska säga
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?
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;
}
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?
Tror inte det, ser ut såhär:
Vad händer i din minimum-beräkning om c = t?
g blir minsta?
Mm, och om g inte är den minsta då?
då blir poängen inte korrekt. men hur ska jag fixa det? ändra till <= i if satserna?
Ja, det är ett sätt.
Klarade fortfarande inte alla testcases
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.
Kan testa, skrev in TTCCGGG och fick alltså 31 poäng vilket blir rätt 2*2+2*2+3*3+2*7.
Tack, nu fungerade det, men varför 52 tecken och borde inte 51 räcka med eftersom det sista är väl '\0'?
Radavslutningen '\n' är där också.
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);