kmjp's blog

競技プログラミング参加記です

AtCoder ARC #034 : A - 首席、B - 方程式

ARC#034は不参加。出てもDが部分点どまりだったろうな…。
http://arc034.contest.atcoder.jp/tasks/arc034_1
http://arc034.contest.atcoder.jp/tasks/arc034_2

A - 首席

N人の受験生がそれぞれ5科目の試験を受けた。
各受験生の得点は、最初の4科目の得点と5科目の得点に110/900を掛けたものの和である。
N人のうち最高得点は何点か。

愚直に計算して最高点を求めればよい。
なんか東大の2次試験の配点みたい。

double ret;
int N,A[5];

void solve() {
	int i,j,k,l,r,x,y; string s;
	cin>>N;
	FOR(i,N) {
		cin>>A[0]>>A[1]>>A[2]>>A[3]>>A[4];
		ret=max(ret,A[0]+A[1]+A[2]+A[3]+A[4]*11/90.0);
	}
	_P("%.12lf\n",ret);
}

B - 方程式

正整数nの各桁の和をf(n)とする。
Nが与えられるので、X+f(X)=NとなるXを列挙せよ。

nは10^18以下なので、f(n)は最大でも162。
よってN-172≦X≦NとなるXに対し、X+f(X)を求めてみればよい。

ll N;
vector<ll> V;

int dig(ll X) {
	int ret=0;
	while(X) ret+=X%10, X/=10;
	return ret;
}

void solve() {
	int i,j,k,l,r,x,y; string s;
	
	cin>>N;
	for(ll X=max(1LL,N-900);X<=N;X++) {
		if(X+dig(X)==N) V.push_back(X);
	}
	
	_P("%d\n",V.size());
	ITR(it,V) _P("%lld\n",*it);
}

まとめ

ここまではABCと大差ない難易度。
特にBがいつもよりも易しい。