はい。
https://atcoder.jp/contests/abc119
oox- 928(+9) でした。
A - Still TBD
#include<bits/stdc++.h>
using namespace std;
int main(){
int y,m,d,ans;
scanf("%d/%d/%d",&y,&m,&d);
if (m>4) printf("TBD\n");
else printf("Heisei\n");
return 0;
}
print(["Heisei","TBD"][int(input().replace("/",""))>20190430])
参加当時はmmだけ見ればとは気づかなかったらしいです。mmだけ見れば大丈夫です、多分。
B - Digital Gifts
#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<n;++i)
#define sc1(a) scanf("%d",&a)
int main(){
int mod=1000000007;
int n,m;
double ans=0.0;
sc1(n);
rep(i,n) {
double p;
char s[5];
scanf("%lf %s",&p,s);
if (s[0]=='J') ans+=p;
else ans+=p*380000.0;
}
printf("%.15lf\n",ans);
return 0;
}
n=int(input())
ans=0
for i in range(n):
a,b=map(str,input().split())
if b=="JPY": ans+=float(a)
else: ans+=float(a)*380000
print(ans)
JPYとBTCを間違えず判定して加算し続ける。あと誤差とかに気をつける。でも多分そこまで意識して気にしなくてもなんとかなるのではないかと。
C - Synthetic Kadomatsu
#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<n;++i)
int himo[10];
int mod=1000000007;
int n,a,b,c,l[10],ans=mod;
void cal(int x){
if (x==-1) {
int cnt=0,chk[3]={0,0,0};
rep(i,n){
if (himo[i]<3) {
int w=himo[i];
if (chk[w]>0) cnt+=10;
chk[w]+=l[i];
}
}
if (chk[0]>0 && chk[1]>0 && chk[2]>0) ans=min(ans,cnt+abs(a-chk[0])+abs(b-chk[1])+abs(c-chk[2]));
return;
}
rep(i,4) {
himo[x]=i;
cal(x-1);
}
}
int main(){
scanf("%d %d %d %d",&n,&a,&b,&c);
rep(i,n) scanf("%d",&l[i]);
cal(n);
printf("%d\n",ans);
return 0;
}
def ns(X, n):
if (int(X/n)):
return ns(int(X/n), n)+str(X%n)
return str(X%n)
n,a,b,c=map(int,input().split())
t=[a,b,c]
l=[]
ans=-1
for i in range(n):
l.append(int(input()))
for i in range(4**n):
tmp=ns(i,4)
tmp="0"*(n-len(tmp))+tmp
h=[0]*3
p=0
for j in range(n):
if tmp[j]=="1":
if h[0]!=0: p+=10
h[0]+=l[j]
elif tmp[j]=="2":
if h[1]!=0: p+=10
h[1]+=l[j]
elif tmp[j]=="3":
if h[2]!=0: p+=10
h[2]+=l[j]
if 0 in h:continue
for k in range(3):
p+=abs(h[k]-t[k])
if ans==-1: ans=p
else: ans=min(ans,p)
print(ans)
はい、概ね方針はあっていたのですがミスにより本番中にはAC出来ませんでした。方針としてはそれぞれ1本の棒に対して使わない、Aに使う、Bに使う、Cに使うの4通りが最大で8本の65536通りくらいを全部試します。
4進数を作って1桁目が1本目の棒、2桁目が2本目の棒...と割り当ててそれぞれの桁の数字が0なら使わない、1ならA、2ならB...という感じに。A,B,Cのそれぞれに2本目以上が割り当てられたらMP10発生の計算もする。割り当て終わったら指定されている長さとの差分のMP消費も計算する。あと割り当てがなかった場合にはcontinueでMP計算しないで(計算すると竹を選んでいない0から指定の長さに増やす操作になるからダメ)次のパターンを試しに行きました。
本番中は4進数の作り方が適当で桁数 < 棒の本数 の時に末尾に0を付け足していたのですが、それだと1本目の棒が必ず使うようになっていて全パターン試せていなくてWAでした。
D - Lazy Faith
#include<bits/stdc++.h>
using namespace std;
#define rep(i,n) for(int i=0;i<n;++i)
#define sc1(a) scanf("%d",&a)
#define sc2(a,b) scanf("%d %d",&a,&b)
#define sc3(a,b,c) scanf("%d %d %d",&a,&b,&c)
#define sl1(a) scanf("%lld",&a)
#define sl2(a,b) scanf("%lld %lld",&a,&b)
#define sl3(a,b,c) scanf("%lld %lld %lld",&a,&b,&c)
int main(){
int a,b,q;
long long t,f=1000000000005;
sc3(a,b,q);
vector<long long> kami(a);
vector<long long> tera(b);
rep(i,a) sl1(kami[i]);
rep(i,b) sl1(tera[i]);
rep(i,q) {
sl1(t);
long long kl = upper_bound(kami.begin(),kami.end(),t)-kami.begin();
if (kl!=0) kl=t-kami[kl-1];
else kl=f;
long long tl = upper_bound(tera.begin(),tera.end(),t)-tera.begin();
if (tl!=0) tl=t-tera[tl-1];
else tl=f;
long long kr = lower_bound(kami.begin(),kami.end(),t)-kami.begin();
if (kr!=a) kr=kami[kr]-t;
else kr=f;
long long tr = lower_bound(tera.begin(),tera.end(),t)-tera.begin();
if (tr!=b) tr=tera[tr]-t;
else tr=f;
long long ans=min(min(max(kl,tl),max(kr,tr)),min(min(kr,tl)*2+max(kr,tl),min(kl,tr)*2+max(kl,tr)));
printf("%lld\n",ans);
}
return 0;
}
import bisect
w=20000000001
a,b,q=map(int,input().split())
s=[int(input()) for i in range(a)]
t=[int(input()) for i in range(b)]
for i in range(q):
x=int(input())
ans=w
tmp=x
ls=bisect.bisect_left(s,tmp)
lt=bisect.bisect_left(t,tmp)
if (s[ls-1]<=tmp and t[lt-1]<=tmp): ans=min(ans,tmp-min(s[ls-1],t[lt-1]))
if (s[ls-1]<=tmp and lt<b and t[lt]>=tmp): ans=min(ans,(tmp-s[ls-1])+(t[lt]-s[ls-1]),(t[lt]-tmp)+(t[lt]-s[ls-1]))
if (ls<a and s[ls]>=tmp and t[lt-1]<=tmp): ans=min(ans,(tmp-t[lt-1])+(s[ls]-t[lt-1]),(s[ls]-tmp)+(s[ls]-t[lt-1]))
if (ls<a and lt<b and s[ls]>=tmp and t[lt]>=tmp): ans=min(ans,max(s[ls],t[lt])-tmp)
print(ans)
コンテスト中にはできませんでした。割りと適当に調べてもなんとかTLEにならずセーフみたいです。寺・神社を西だけに探しに行く、どちらかを西(東)で探してから折り返して東(西)に探しに行く、東だけに探しに行くのを適当に調べます。折り返す前にどちらを先に行ってるかで合計距離変わるので両方計算する。折り返す前に完了してるパターンがありえますけども、それは西(東)だけ探すパターンになるので問題ないです。C++でもPythonでも二分探索が標準で使えるのでもうちょっと上手に使えるように。