0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

はじめに

はじめまして

現在は京都に住んでいる大学院生です。atcoderに関する投稿を行っていきたいなと思っています.

つい先月まで就活をしていました.多浪ということで、ただでさえハードな就活がコロナによってさらにベリーハードになるのではと不安になりました.しかし、特につまずくことなく無事終えることができました.

内定くださった企業さんありがとうございます.

atcoderの現在のレートは下図のような感じです.多浪らしく残念なくらいのんびりした成長スピードですが、頑張っていきます

スクリーンショット (111).png

自習をしリハビリしてからABCに参加しようか悩みましたが、実践あるのみということでとりあえず記念すべきABC200に参加させて頂きました.

ABC200[https://atcoder.jp/contests/abc200]

#全体の感想
A、B、C問題は15分程で解答できました.しかし、D問題はさっぱり分からず1時間考えた後、諦めてお風呂に入りました。

順位を途中見た感じ、他の人もD問題で苦戦してるように見えました。

各問題の感想

A問題

100で割って,割り切れるかどうかで1を足すか判別させました。

n=int(input())
if n%100==0 :
    print(n//100)
else :
    print(n//100+1)

B問題

操作通りに実装しただけです.200の倍数であれば、200で割り、そうでなければ1000倍した後に200を加えました。

n,k=map(int,input().split())
for i in range(k) :
    if n%200==0 :
        n=n//200
    else :
        n=n*1000+200

print(n)

C問題

200という数字がやたら出てくるのは200回目だからかな、と思いつつC問題を解きました。

「差をとった際に200で割り切れる組み合わせの個数は」という問題でした.差をとって200で割り切れるということは、言い換えれば「200で割った際、余りが同じ数字の中から2組を選んだ場合の数」かなと考えました。

そこで、countというリストを作り、余りがiとなる数字が数列にあればcountのインデックスiに1を加えて個数を数えました。

最後にcountリスト内に2以上の数字nが出てくれば、nC2で計算しました。

n=int(input())
a=list(map(int,input().split()))
count=[0]*200
ans=0

for i in a :
    count[i%200]+=1
for i in count :
    if i==0 or i==1 :
        continue
    else :
        ans+=i*(i-1)/2
print(int(ans))

D問題

これに関しては解いている最中はさっぱり分かりませんでした.数列B、Cはなんか個数も異なる場合があるみたいだし何でもありなのか?と思い、どうすればいいか全くでした.

解説を読むとどうやら鳩ノ巣原理を使うようです.競プロというよりもはや数学だ、、、
8種類の余りが存在すれば、2**8=256で一応256種類の数字が出てくることから、少なくとも余りは0から199まで存在し、256-200=56で56個はどこかの余りと被るようです.

はじめは256種類の数字について、そもそもすべて異なる余り(0から199の余りが出現)になる保証はあるのか?とか、その場合8種類の選び方にも何かしら条件があるのでは?とか、余計な事を考えました。

ここの範囲については高校数学Aの整数分野について学習しなおした方が良さそう、、、

n=int(input())
a=list(map(int,input().split()))
m=min(n,8)
count=[0 for _ in range(200)]

for i in range(1,2**m) :
    cnt=0

    #----enumerateはインデックスと要素を出力----#
    for j,k in enumerate(a) :
        if i>>j&1 :
            cnt+=k
    cnt%=200
    if count[cnt]==0 :
        count[cnt]=i

    #----同じ余りが二つある場合----#
    else :

        #----先にi番目について----#
        print("Yes")
        blst=[]
        clst=[]
        for l in range(m) :
            if i>>l&1 :
                blst.append(l+1)
        i=count[cnt]

        #----次にcount[cnt]に書かれている順番について----#
        for o in range(m) :
            if i>>o&1 :
                clst.append(o+1)
        print(len(blst),*blst)
        print(len(clst),*clst)
        exit()

print("No")

E、F問題

まだ僕には解くのは早いようです.精進してからまたいつの日か解きます.

修論書く前には解けるようになりたいなあ(願望)

最後に

久しぶりのABCでしたが、思いのほか解けました.レートも上がって万々歳です.9月以降は修論が本格的に始まり、そちらのコードを書かないといけないので、恐らくABCに参加できる頻度は下がるかなあと.

7月中にはぜひ緑まで行きたいですね.

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?