Codeforces Round #45 C. The Race
問題概要
燃料1リットルで10Km走る車が、ガソリンスタンドが100Kmおきにある道を以下のように走る。
- そのスタンドで給油しなければ次のスタンドに着けないならαリットル給油する
- そうでないならそのスタンドには立ち寄らない
αは10以上の実数で、与えられない。
最初に立ち寄るn個のスタンドの番号が与えられるとき、
次に立ちよるスタンドの番号が一意に定まるならuniqueの文字列およびその番号を出力し、そうでないならnot uniqueを出力せよ。
解法
立ち寄るスタンドの配列をd[i]とする。
d[i]番目のスタンドに立ち寄る⇔(i+1)*α/10の整数部分がd[i]
であるため、
スタンドの情報からありうるαの区間を絞り込んでいける。
そこからn+1個目のスタンドが一意に定まるか(すなわち、αが最大値を取ったときのn+1個目のスタンドと、αが最小値を取ったときのスタンドが一致するか)を見ればよい。
ソースコード
void run() { int n,d[1000]; cin>>n; rep(i,n)cin>>d[i]; double l=-inf,u=inf; rep(i,n) { l=max(l,d[i]/(i+1.0)); u=min(u,(d[i]+1)/(i+1.0)); } int a=(int)(l*(n+1)),b=(int)(u*(n+1)-EPS); if(a==b)printf("unique\n%d\n",a); else puts("not unique"); }