【AtCoder】ABC389【灰】C++

แชร์
ฝัง
  • เผยแพร่เมื่อ 25 ม.ค. 2025

ความคิดเห็น • 13

  • @コイルビーム
    @コイルビーム 6 ชั่วโมงที่ผ่านมา

    今回は難しかった...単純なforや出力だけで解ける問題がなかった。
    ひとひねりしないと回答できない...
    自分はABまでしか解けませんでした...
    あと、タイトルがABC389ですよ

  • @onigiri47
    @onigiri47 14 ชั่วโมงที่ผ่านมา

    B問題「前割る後ろが常に同じ」という結論に至れたのいいですね
    A問題、実際にやる方法が取れるとよかったですね。
    「配列の要素を入れ換える」
    →「チェックする」
    →「もとに戻す(最初と同じ場所を入れ換える」
    入れ換える候補はi番目とi + 1番目になるから、計4回これをする感じです。
    配列の要素を入れ換える関数の使い方(もしくは作り方)は調べれば出るので、知らない場合は調べていきましょう。
    ちなみに、他の方が言っているBの式変形は紙に式を書きながら確認してみると納得が出来ると思います。
    たとえば、「2,4 ,8,16」や「200,100,50,25」のような等比数列、「2,3,4,5」のような等比数列でないパターンで書いて見ると納得できるはずです。
    B問題で出てくる、
    x/y = a/bを
    意味の等しい
    x * b = a * y
    に変える工夫は便利なので、「少数やだなあ」と思ったときに思い出しましょう

  • @aikawa_aoi_Love
    @aikawa_aoi_Love วันที่ผ่านมา +5

    聞いてー✨️✨️
    入茶しましたー🤎🤎🤎
    やったー✨️✨️✨️

    • @WillowLog
      @WillowLog  วันที่ผ่านมา +1

      入茶おめでとう御座います!🥳㊗️🥂🍾
      °˖✧⁽⁽◝(⁰▿⁰)◜◝(⁰▿⁰)◟₎₎✧˖°

  • @鳩でもわかるC
    @鳩でもわかるC วันที่ผ่านมา

    A[i+1]/A[i] = A[i+2]/A[i+1] から A[i+1]の2乗 = A[i] * A[i+2] に変形される部分
    左の式の両辺にA[i] * A[i+1]を掛けると右の式になります。

  • @鳩でもわかるC
    @鳩でもわかるC วันที่ผ่านมา +1

    あー、残念。というか今回は難しかったですよね。
    私もA問題とB問題で1回ずつWAしてしまいました。
    A問題:問題文に「隣り合う 2 つの項」とあるのに「隣り合う」を見落としていた。入力が "2 1 3 4 5","1 3 2 4 5","1 2 4 3 5","1 2 3 5 4"のうちいずれかであればYes、そうでないならNoでした。
    B問題:前項で割り算して答えがすべて同じならYesだと思っていたら除算に伴う誤差でWA。これはWAしたときに気づいた。B問題にしては難しくないか?
    C問題:これは普通にできた。
    D問題以降、まるで歯が立たず・・・でした。
    お互いがんばりましょう。

    • @WillowLog
      @WillowLog  วันที่ผ่านมา

      A問題の「隣り合う」については引っかかった話がXとかでもありました🫣
      数が多い割り算については全く対応できませんでした。こういう時は小さい範囲で確認するんですね🥲

  • @user-jk1mw2yh5d
    @user-jk1mw2yh5d 23 ชั่วโมงที่ผ่านมา

    A問題、肝心な一行抜けてて沼てっしまったW
    WillowLog さんが提出されたコードでWAとなるケース書いときます
    i:1 2 3 4 5
    A:5 2 3 4 1
    ans=No
    これが Yes になってWA
    iとA[i]を比較すると、隣り合ってなくてもcountしてしまう!
    あくまで隣と比べないとダメ
    A問題考えてるとき、swapを口にしてて惜しい!
    隣り合う組は(a1,a2)(a2,a3)(a3,a4)(a4,a5)だから
    これらを入れ替えたら[1,2,3,4,5]になるか判定すればいい!
    B問題、公比が実数になるパターン忘れてて、入力例3で?ってなったw
    入力例2の説明のとこみて、判定方法に気がついて通した
    数学の問題だから、前提知識が必要
    a:b=c:d とか書いてるのは比を表していて、a対bはc対dと比(割合)が同じということ
    このとき
    a/b=c/d と式にできる
    このままでは実数になってしまうので
    a*d=c*b と式変形して判定に使う
    等比数列では
    A[2]:A[1]==A[i+1]:A[i] となれば A[2],A[1] と A[i+1],A[i] の比は同じ
    これが全ての i と i+1 に言えれば等比数列と言える
    このとき A[2]/A[1] が等比数列の公比 r になっているはず
    A[2]:A[1]==A[i+1]:A[i] これは
    A[2]/A[1]==A[i+1]/A[i] と書け
    A[2]*A[i]==A[i+1]*A[1] と式変形できるのでこれで判定
    あとは i+1 を範囲外にならないよう気をつければよい
    って感じでやりました
    実数で処理すると誤差でやられるので、式変形で逃げるのはあるある!

  • @DDincrement
    @DDincrement วันที่ผ่านมา

    お疲れ様でした。
    今回難しかったですよね。
    B問題が、「double型の欠点を知ってないといけない」+「その回避には等比中項という話をしらないといけない」のコンボでwillowさんにはちょっと厳しかったかもしれませんね。
    Aは、油断で足を掬われましたかね?
    そして、C問題がグリッド問題だったので、willowさんには一番楽だった説。

    • @DDincrement
      @DDincrement 22 ชั่วโมงที่ผ่านมา

      willowさんの解答方針に合わせた解説おいときます。
      A問題
      ちょうど1回の入れ替えで昇順になるということは、本来の位置と違う位置にある数がちょうど2つであることと等価です。
      あとは入れ替えが隣り合うもの限定であることをどう取り扱うかですが、「隣り合うものの入れ替え1回で揃う」を「入れ替え1回で揃い、しかもその入れ替え位置が隣同士である」と考えることで実装できます。
      B問題
      隣同士での割り算が全て同じ答えになるか確認するコードを書けば正解の99%までたどりついています。(2回目の提出がこの段階)
      残り1%の問題点は、double型は==の判定が信頼できないこと。
      例えば「1/3=0.333333と10/30=0.33333は、3の個数が違うから等しくない!」のような感じで、割り切れない計算を打ち切る都合で差が発生してしまう場合が稀にあるからです。
      よって、割り算の結果が等しいことの確認をしたい場合、どうにかして割り算せずに行わなければなりません。
      a/b==c/dはa*d==c*bと等価であることを利用しましょう。
      B問題の1回目と3回目の提出は、saが小数を扱えない型だったためにnowの値を正しく引き継げなかったことが原因ですね。
      2回目の提出はnもdouble型にしてしまった悪影響があるかもしれないので、再挑戦のときにはぜひ再度しっかり型の確認をしましょう。