0
0

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 3 years have passed since last update.

AtCoder Beginner Contest 167備忘録

Last updated at Posted at 2020-05-10

#初めに
この記事を参考にしようと思って来た人。残念。
A,B,C,D理解済み
#A - Registration

s==t[0:-1]#(というか[:-1]でもよかった気が...)

#B - Easy Linear Programming
順に枚数を引いていけばok
汚いソースコード。

def j():
    a,b,c,k=map(int,input().split())
    o=0
    x=k
    if a!=0:
        o+=a
        k-=a
        if k==0:
            return a
        elif k<0:
            return x
    if b!=0:
        k-=b
        if k<=0:
            return a
    if c!=0:
        k-=c
        o-=c
        if k==0:
            return o
        elif k<0:
            return o-k
print(j())

#C - Skill Up
飛ばした。
全探索苦手。
次までには学ばねば。

追記
bit探索というものでできるそうだ。
なので学んで挑戦してみた。
結果、一発クリアだった。bit探索法は便利だということが分かった。

n,m,x=map(int,input().split())
item=[list(map(int,input().split()))for i in range(n)]#金、アルゴリズムUp数
bag=[]#条件を満たす本の買い方
for i in range(2**n):#すべて調べる
    temp=[]#買う本
    job=[0]*m#理解度
    for s in range(n):#全桁を調べる
        if (i>>s)&1:#買うのであれば
            temp.append(s)#買う本を追加
            for y in range(m):
                job[y]+=item[s][y+1]#理解度を足す
    for s in range(len(job)):
        if job[s]<x:#もし、理解度がX未満であればbreak
            break
    else:#理解度がすべてX以上ならば
        money=0
        for s in temp:#合計金額を算出
            money+=item[s][0]
        bag.append(money)
#買う組み合わせが1以上なければ-1を出力
print(min(bag) if len(bag)>=1 else -1)

#D - Teleporter
K回for回したらTLEにしかならないのでループの最初と最後で余剰すれば行ける。
と思ったのに行けなかった。だれか教えて。ちなみに問題文の例はできている。


n,k=map(int,input().split())
a=[int(i)-1 for i in input().split()]
ed=[False]*n
go=0
c=0
cc=0
while not ed[go]:#既に通っていたら終了
    print(a[go]+1)
    ed[go]=True
    go=a[go]
    c+=1
ed=[False]*n
print()
while not ed[go]:#二回目のループは違う可能性があるため6,5,2,5,3,2の場合、6,2,5,3,2,5,3,2,5,...となる
    print(a[go]+1)
    ed[go]=True
    go=a[go]
    cc+=1#別変数で保存
print()
for i in range((k-c)%cc):
    print(a[go]+1)
    go=a[go]
print()
print(go+1)

追記
whileをまとめて、printをforで回さずに、値を保存して、一回もループをしていなかった場合の出力を追加したらできた。

n,k=map(int,input().split())
a=[int(i)-1 for i in input().split()]
p=0
visited=[0]*n
first=[]
roop=[]
while visited[p]!=2:#二回通っていたらやめる
    if visited[p]==0:#初めて通った
        first.append(p)
    else:#一回通った
        roop.append(p)
    visited[p]+=1#通った跡をつける
    p=a[p]#テレポート
if len(first)>k:#一回もループしないのなら
    print(first[k]+1)#最初のk番目
else:
    print(roop[(k-(len(first)-len(roop)))%len(roop)]+1)#そうでなければkから一回目のループと二回目のループを引いて二回目のループの回数の余剰

#最後に
EとFは辿り着けなかった。
3回目の挑戦だったが難しい。もっとアルゴリズムを学び、論理的思考ができる頭にしなければと思った。ちなみに新Ratingは68。

0
0
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
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?