問題レポートにGDUT_冬季訓練ソリューション_問題レポートに話題I_K個人の問題解決

問題レポートにGDUT_冬季訓練ソリューション_問題レポートに話題I_K個人の問題解決

トピック:

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

この問題は、私だけがこの料理チキン、第三、質問の最初の意味は、非常に多くの二次関数を練習しましょう、F(X)はxで呼び出される関数があり、裸の三分のテンプレートである必要があり、最大のすべての二次関数を取ります値が、その後、我々は、画像F(x)は、F(x)の最小値を見つける得ることができます

アイデアの段階:

Fを:1.図面は、我々は2つの非常に狭い二次関数を参照することができ、彼らは、スリットを形成し、ほぼすべての関数の値をカバーすることができますが、おそらく過去に間することがありますすることができ、簡単に言えば、我々は描画することで結論を得ることができます必ずしも単一のピーク関数(x)関数は、最小点が短い中で、そこにある最小点まで至らない点までで、最小点は、私たちの答えは、単一ピークの関数です。

実際にこの結論を引き出すために、短いステップを話す2.最初のステップは、特定の画像処理能力を必要とするだけでなく、特に難しいことではありません。

-------------半分と異なる3つが、2点が与えられる。延伸の条件を満たすように、最大/最小ポイントの手前には、条件を満たすために、次に答えは反対側にある必要があり、その後範囲を狭くしていきしかし、三分の一異なります。
------------範囲内の最小値または最大値を求めるための第三のアイデアはそのように説明することができます。

第三:期間の範囲内:この時間は(L、R)は3つの部分に分割されてL、R、これらのうちの2点を見つけると、2つのサブ方法があり、3人に3および4の部分を撮影しました一部

- >それは何を意味して4つの3で一部取りますか?これらの二つのセットポイントはMID1とMID2
(R&LT + L)/ 2、MID2 =(R&MID + LT)/ 2又は(L + MID)/ 2、= MID1
MID1:>三重を理解することは容易です- =(L 2 + R&LT)/ 3 = ;;; MID2(R&LT L + 2)/ 3

両方とも可能である、パーソナル文言を参照;
第三は、次のステップを決定することである:
凸関数の一例として、最小(二つの大きな中央小)を見つけるために、
3つの場合:
1.場合は左次いでMID1、Fに対する答え(MID1)<F(MID2)
2、次いでMID1とMID2の間に答えがある場合はF(MID1)<F(MID2 ) 又はF(MID1)> F(MID2)
3、F右MID2への答えがある場合(MI1)> F(MID2)
私たちは分類この:
F(MID1)<F(MID2がいる場合 )、 その後、MID2で答えは左、R = MID2ことができますので、
もしF(MID1)> F(MID2 )、 そしてその答え右MID1、L = MID1を作ることができます。

ステートメントは、浮動小数点バイナリ(RL <編){}の端部であるながら、
これは精度編あり、

コードの実装:

#define ULL unsigned long long
using namespace std;
typedef struct element
{
	double a,b,c;
}ele;

ele all[10010];

int t,n;
double f(int i,double x)
{//fi(x)的求值函数
	return all[i].a*x*x+all[i].b*x+all[i].c;
}
double F(double x)
{
	double _MAX=f(0,x);
	for(int time=1;time<n;time++)
	{
		if(f(time,x)>_MAX)_MAX=f(time,x);
	}
	return _MAX;
}

int main()
{
	scanf("%d",&t);
		for(int time=0;time<t;time++)
		{
			scanf("%d",&n);
			for(int time1=0;time1<n;time1++)
			{
				scanf("%lf %lf %lf",&all[time1].a,&all[time1].b,&all[time1].c);
			}
			double l=0;
			double r=1000;
			while(r-l>1e-9)
			{
				double mid1=(l*2+r)/3;
				double mid2=(l+r*2)/3;

				if(F(mid1)<F(mid2))r=mid2;
				else l=mid1;
			}
			printf("%.4f\n",F(l));
		}
    return 0;
}
发布了9 篇原创文章 · 获赞 0 · 访问量 198

おすすめ

転載: blog.csdn.net/DevourPower/article/details/103965177