[RUBY] Concours AtCoder Débutant 168

Le troisième défi.

Un problème

Un exemple d'utilisation de l'instruction case, mais notez tout et passez

abc168a.rb


n = gets.chomp.to_s[-1,1]
#puts n
#puts n[-1,1]
if n=="3"
    puts "bon"
else
    if  n== "0"
    puts "pon"
    else
        if n== "1"
        puts "pon"
        else
            if n== "6"
                puts "pon"
            else
                if n=="8"
                    puts "pon"
                else
                    puts "hon"
                end
            end
        end
    end
end

Réécrit correctement avec une déclaration de cas.

case.rb


n = gets.chomp.to_s[-1,1]
case n 
when "3"
    puts "bon"
when "0","1","6","8"
    puts "pon"
else
    puts "hon"
end

Problème B

Si la sortie est longue, il est plus judicieux de la couper et d'ajouter 3 points à la fin, plutôt que de diviser la sortie en cas.

abc168b.rb


k = gets.chomp.to_i
s = gets.chomp.to_s
if s.length <= k
    puts s
else
    print s[0..k-1]
    print "..."
end 

Problème C

Puisque les coordonnées de la pointe des deux aiguilles peuvent être obtenues, la distance entre les deux points peut être calculée directement. En traitant chaque valeur numérique comme un entier, elle est devenue la moitié AC moitié WA du cas de test, donc après avoir réfléchi pendant un moment, convertissez-la en float et AC. Comme mentionné dans l'explication, la résolution avec le théorème du cosinus réduit la quantité de calcul de 3 fonctions triangulaires, mais est-ce correct parce qu'il n'y a pas de boucle?

abc168c.rb


imput = gets.chomp.split(" ").map!{|item| item.to_i}
a = imput[0].to_f
b = imput[1].to_f
h = imput[2].to_f
m = imput[3].to_f

hang = Math::PI*(30*h + m/2)/180
mang = Math::PI*m*6/180

hy = Math.sin(hang)*a
hx = Math.cos(hang)*a
my = Math.sin(mang)*b
mx = Math.cos(mang)*b
puts Math.sqrt((hy-my)**2 + (hx-mx)**2)

Si l'aiguille courte est utilisée comme axe de coordonnées, le calcul pour deux fonctions triangulaires sera réduit.

abc168c.rb


imput = gets.chomp.split(" ").map!{|item| item.to_f}
a = imput[0]
b = imput[1]
h = imput[2]
m = imput[3]

hang = Math::PI*(30*h + m/2)/180
mang = Math::PI*m*6/180
ang = mang - hang

mx = Math.cos(ang)*b
my = Math.sin(ang)*b

puts Math.sqrt((a-mx)**2 + (my)**2)

J'ai abandonné parce que je ne pouvais pas résoudre le problème D après avoir lu le problème D pendant plus de 60 minutes ici. La seule façon de contester D / E / F est de résoudre un exemple d'algorithme et de l'acquérir. Il semble qu'il soit nécessaire de traiter un certain nombre de questions classiques passées afin de ne pas dépendre de compétences de puissance comme le problème A cette fois.

Recommended Posts

Concours AtCoder Débutant 168
Article sur la participation au concours AtCoder
AtCoder Débutant Contest 132 D Problème
Résolvez AtCoder Beginner Contest 151 avec Java
Résolvez AtCoder Beginner Contest 153 avec Java
Résolvez AtCoder Beginner Contest 160 avec Java
Résolvez AtCoder Beginner Contest 152 avec Java
Résolvez AtCoder Beginner Contest 156 avec Java
AtCoder Beginner Contest 167 Problème C (Java)
AtCoder Beginner Contest 169 A, B, C avec rubis
AtCoder Beginner Contest 170 A, B, C jusqu'au rubis
Apprendre Ruby avec AtCoder 6 [Concours 168 Donc]
Résolution avec Ruby AtCoder ACL Débutant Contest C Union Find (DSU)
java débutant 4
Apprendre Ruby avec AtCoder 7 [Contest 168 Triple Dots]
java débutant
L'histoire d'un super débutant participant pour la première fois au concours AtCoder (AtCoder Beginner Contest 140)