#初めに
この記事を参考にしようと思って来た人。残念。
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。