[C++]白俊2597号:巻尺


質問リンク
2597号:巻き尺折りたたみ
問題の概要
巻き尺があり、巻き尺には赤点、青点、黄点のペアがあります.ルーラーを赤、青、黄の順に折りたたむ場合は、ルーラーの最終長さを求める必要があります.
方法
簡単な実施問題だと思いますが、思ったより時間がかかりそうです.
l、rという変数を宣言し、開始時に0と(ルーラーの長さ)に初期化します.
赤点の中間値midを求め、ベンド値を使用して青点、黄点、l、rの値を更新します.これは、l、rの中間値ではなくmid値が右か左側かに依存します.
青点も同様で、黄点とl、rの値を更新します.
最後に黄点の中間値を求め,l,rの値を更新する.
結果的にl,rの車を少し変形して出力すればいいのです.
実際、これは一度で正解できる問題ですが、少数の1位しか出力されない条件の下で、いくつかのエラーが発生したため、私たちは何度かWAを受け取りました.std::cout.precisionを利用したが,少数の2番目の位置で四捨五入することに気づかなかった.
std::coutを使用しようとするとコードが長くなりますのでprintfを使用したほうがいいです.
コード#コード#
#include <bits/stdc++.h>

using namespace std;

pair<double, double> arr[3];

double update(double mid, double num) { return mid + fabs(mid - num); }

void func(int idx, double& l, double& r)
{
	if (arr[idx].first == arr[idx].second)
		return;

	double mid = (arr[idx].first + arr[idx].second) / 2;

	for (int i = idx + 1; i < 3; i++)
	{
		arr[i].first = update(mid, arr[i].first);
		arr[i].second = update(mid, arr[i].second);
	}

	l = update(mid, l);
	if (l > r)
		r = l;
	l = mid;
}

int main(void)
{
	double len;
	cin >> len;

	double left = 0, right = len;

	for (int i = 0; i < 3; i++)
		cin >> arr[i].first >> arr[i].second;

	for (int i = 0; i < 3; i++)
		func(i, left, right);

	double res = right - left;
	res *= 10;
	res = floor(res);
	res /= 10;
	cout << fixed;
	cout.precision(1);
	cout << res;
	return 0;
}