結果

問題 No.180 美しいWhitespace (2)
コンテスト
ユーザー nablaenergy_21
提出日時 2015-04-14 13:55:35
言語 C++11
(gcc 15.2.0 + boost 1.89.0)
コンパイル:
g++-15 -O2 -lm -std=gnu++11 -Wuninitialized -DONLINE_JUDGE -o a.out _filename_
実行:
./a.out
結果
AC  
実行時間 3 ms / 5,000 ms
コード長 1,106 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 222 ms
コンパイル使用メモリ 40,576 KB
実行使用メモリ 6,144 KB
最終ジャッジ日時 2026-03-25 22:17:36
合計ジャッジ時間 1,288 ms
ジャッジサーバーID
(参考情報)
judge3_0 / judge1_1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 31
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

#include <stdio.h>

/*
max(a_i + b_i x)-min(a_i + b_i x)はxの凸関数なので、三分探索がつかえそう。

そこでまず最小のxがとりうる範囲を調べたいのだが、とりあえずなんか決め打ちして、
x<10^9くらいだと思って調べることにする。
*/

long long  N;
long long a[1000],b[1000];
long long i,s,t,u,v,ans;

long long min(long long a, long long b){
	if(a>b){return b;}else{return a;}
}

long long max(long long a, long long b){
	if(a>b){return a;}else{return b;}
}

long long ugly(long long x){
	long long mi,ma;

	mi = 1000000000000000000;
	ma = 0;
	
	for(i=0;i<N;i++){
		mi = min(mi, a[i] + b[i] * x);
		ma = max(ma, a[i] + b[i] * x);
	}

	return ma - mi;

}

int main(void){
	scanf("%I64d",&N);
	for(i=0;i<N;i++){
		scanf("%I64d %I64d",&a[i],&b[i]);
	}

	s = 1;
	t = 1000000000;
	while(t-s>2){
		u = (2*s + t)/3;
		v = (s + 2*t)/3;
		if(ugly(u)<=ugly(v)){t = v;}else{s = u;}
	}
	
	if(ugly(s)<=ugly(s+1) && ugly(s)<=ugly(s+2)){ans = s;}
	else if(ugly(s+1)<=ugly(s) && ugly(s+1)<=ugly(s+2)){ans = s+1;}
	else{ans = s+2;}
	printf("%I64d\n",ans);
}
0