私はK HUD-3714をアンソロジー2019_GDUT_新生児のトピック

トピック:

Josephinaは賢い女の子と最近機械学習にはまっています。彼女は多くの興味深い性質を有する線形判別分析と呼ばれる方法、に多くの注意を払っています。アルゴリズムの効率性をテストするために、彼女は多くのデータセットを収集します。トレーニングデータとテストデータ:しかも、各データは、2つの部分に分かれています。彼女は訓練データにモデルのパラメータを取得し、テスト・データにモデルをテストします。彼女の驚きに、彼女は、各データセットのテスト誤差曲線がちょうど放物線で見つけました。放物曲線は二次関数に相当します。数学では、二次関数は、フォームF(X)= AX2 + BX + Cの多項式関数です。= 0の場合、二次は線形関数に低下します。
ここに画像を挿入説明
これは、1つのテストのみ誤差曲線がある場合は、最小限の誤差を計算することは非常に簡単です。しかし、Josephinaは多く放物曲線を取得する意味し、いくつかのデータセットが存在します。Josephinaは、すべてのデータセットで最高のパフォーマンスをするチューニングパラメータを取得したいと考えています。彼女はつまり、アカウントにすべての誤差曲線を取る必要がありますので、彼女は多くの二次機能に対処し、合計誤差を表すために、新しいエラー定義を行うことがあります。今、彼女は複数の二次機能に関連する次の新しい関数の最小値に焦点を当てています。F(X)= maxのシリコン(Si(X))は、iは1 = ... N:新しい関数F(x)は以下のように定義されます。xのドメインは[0 1000]です。SI(x)は二次関数です。Josephinaは、F(X)の最小値を不思議。彼女はこの問題を解決するために残念ながら、それはあまりにも難しいです。スーパープログラマーとして、あなたは彼女を助けることができますか?
入力
入力は複数のテストケースが含まれています。最初の行は、ケースT(T <100)の数です。各ケースは、数N(N≤10000)から始まります。二次関数の対応する係数を意味し、(| B |≤5000)、C(|≤5000 | C)は、次のn行、各行は三つの整数(0≤≤100)、Bを含有します。
出力
各テストケースの場合、出力行の答え。小数点の後に4桁の数字にラウンド。
サンプル入力
2
1
2 0 0
2
2 0 0
2 -4 2
サンプル出力
0.0000
0.5000

アプローチ:画像が二次関数に類似した後たびに二次関数の最大値を取り、> 0ので、全ての機能が上方に二次開口部であることを、関数が最大値をとる最初の下落した後、ローズ画像。関数値が3点、最大の暴力を使用して計算されたテンプレートを適用します。この問題は、高い精度を必要とし、関数の値が負でもよい考慮する必要があります。

コード:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
using namespace std;
struct function
{
	int a,b,c;
}a[11000];
int n;
double F(double x)
{
	double m=-1e10;
	for (int i=1;i<=n;i++)
		m=max(m,a[i].a*x*x+a[i].b*x+a[i].c);
	return m;
}
int main()
{
	int T;
	double l,r,mid1,mid2;
	cin>>T;
	while (T--)
	{
		memset(a,0,sizeof(a));
		cin>>n;
		for (int i=1;i<=n;i++)
			scanf("%d%d%d",&a[i].a,&a[i].b,&a[i].c);
		l=0;
		r=1000;
		while (fabs(r-l)>1e-10)
		{
			mid1=(l+r)/2;
			mid2=(mid1+r)/2;
			if (F(mid1)<F(mid2))
				r=mid2;
			else
				l=mid1;
		}
		printf("%.4lf\n",F(l));
	}
	return 0;
}
公開された14元の記事 ウォンの賞賛0 ビュー296

おすすめ

転載: blog.csdn.net/qq_39581539/article/details/103964929