AtCoderの重要性
そんなものは始めたてなのでわかりません。ただ論理的に考えたり、学んだことをアウトプットして確認できるので良いなと楽しいです。
就活をしていて気づくのですが、大手のIT企業なんかはAtCoderのスコアかけたりしますね。そういう意味でもただの自己満足というだけでなく、客観的にも判断されるものかもしれません。今はこちら"AtCoder に登録したら次にやること ~ これだけ解けば十分闘える!過去問精選 10 問 ~"から順に解いていっています。
問題(引用です)
【問題概要】
10000 円札と、5000 円札と、1000 円札が合計で NN 枚あって、合計金額が YY 円であったという。このような条件を満たす各金額の札の枚数の組を 1 つ求めなさい。そのような状況が存在し得ない場合には -1 -1 -1 と出力しなさい。
【制約】
1≤N≤2000
1000≤Y≤2∗107
N は整数
Y は 1000の倍数
解いてから思ったこと
まずは、解説と考えるべき部分書いてたんかい!ってことです。けど解いたあとに読んでよかったです。
自分は最近筋トレにはまっていることもあり、パワープレイで押し切ろうとしました。時間無制限なら絶対解は出ると思うんですけども、そうじゃなくてどう最適化するべきかってのを考えないといけなかったです。
高校生の時にやった確率・順列と同じで、全部求めると時間がかかるってことです。なので、1万円札と5千円札
の枚数がわかれば自動的に千円札の枚数は固定されることに気づけばこの問題はOKかなって感じで
提出コード
fromsysimportstdinN,Y=[int(x)forxinstdin.readline().rstrip().split()]a=-1b=-1c=-1foriinrange(N+1):forjinrange(N-i+1):ifi+j+(N-i-j)==NandY==10000*i+5000*j+1000*(N-i-j):a=ib=jc=(N-i-j)breakprint(str(a)+' '+str(b)+' '+str(c))
反省
コレでも正解は正解だったのですけど、処理速度をもっと上げることや、サイズを軽くしていくことにも尽力すべきだなと反省です。formatについても覚えておきたいなと思いました。今回学べたことは、
・- 競技プログラミングにおける入力方法
・- 組み合わせの最適化
です!頭使ってああでもないこうでもないやってると、達成感がすごいです。タバコが美味しい。
競技プログラミングがなにとか全然知らないときは、一度入力データをリストに入れて、そこからその都度出して変数に入れて、、、みたいなことしてたので冗長なコードでした。今回キレイに入力したいと思って、リスト内包表記とstdinモジュールを使ってみました!
組み合わせの件は上記の通りです!まだ全然初めたばかりではありますが、プログラミングというのは基本的な概念さえつかめていれば基礎知識の応用の連続では???その都度モジュール覚えていけばどんどんできるんじゃね???っと僕の中のギャルが気付いてきています。無敵マインドでどんどんこなしていきたいです。駄文失礼しました。