AtCoder Beginner Contest 060/AtCoder Regular Contest 073
はい。
https://beta.atcoder.jp/contests/abc060
A - Shiritori
C++14
#include<bits/stdc++.h> using namespace std; int main(){ int n,m; char a[10],b[10],c[10]; scanf("%s %s %s",a,b,c); printf("%s\n",a[strlen(a)-1]==b[0] && b[strlen(b)-1]==c[0]?"YES":"NO"); return 0; }
末尾と先頭でしりとりになっているか確認。
B - Choose Integers
C++14
#include<bits/stdc++.h> using namespace std; int main(){ int a,b,c; scanf("%d %d %d",&a,&b,&c); printf("%s\n",c%__gcd(a,b)==0?"YES":"NO"); return 0; }
__gcd()便利。
C - Sentou
Python3
n,t=map(int,input().split()) l=[int(i) for i in input().split()] ans=[0]*3 for i in l: if i>=ans[2]: ans[0]+=t ans[1]=i ans[2]=i+t else: ans[0]+=i+t-ans[2] ans[1]=i ans[2]=i+t print(ans[0])
tを先頭から確認する。いま何秒か、T秒後までお湯が出るというのを慎重に計算すれば大丈夫だと思う。。
D - Simple Knapsack
Python3
n,w=map(int,input().split()) d={} p=0 for i in range(n): a,b=map(int,input().split()) if a in d: d[a].append(b) else: d[a]=[b] p=max(p,a) for i in range(4): if p-i in d:d[p-i].sort(reverse=True) else: d[p-i]=[0] l={} for i in d: t=0 l[i]=[0] for j in d[i]: t+=j l[i].append(t) ans=0 for ai,i in enumerate(l[p]): for bj,j in enumerate(l[p-1]): for ck,k in enumerate(l[p-2]): for em,m in enumerate(l[p-3]): x=ai*p+bj*(p-1)+ck*(p-2)+em*(p-3) if x<=w: ans=max(ans,i+j+k+m) print(ans)
各重さで使うのは価値が大きい方から累積和?を取っておく。サンプル2の入力だと、
[10] #4 [7,13] #3 [1] #2 [0] #1
書き方にも拠るでしょうけど重さが4種類で各種には1つデータがあるはず想定している何も入ってないのがあるとエラーで落ちるか、ループ処理が途中で終わって調べたい全パターンが調べられなかったりすると思うので事前に注意しておく。 あとこれ4重ループにしてるんですけど4重にする意味はなくて、制限のw - 3重までの重さの総和 で追加可能な重さが定まるので4重目は回す意味無いです。多分。