マインドコントロールCodeForces - 1291C(思考)

あなたとあなたのn-1N-1友人は整数の配列A1、A2、...、ANA1、A2、...、発見しました。あなたは、次の方法でそれを共有することを決定した:あなたのすべてのnnは特定の順序で並んで立っています。それぞれの分、最初のまたは配列の最後の要素のいずれかのラインを選ぶの前で人は、それを削除し、自分自身のためにそれを保持します。彼はその後、ラインから外れ、およびラインで次の人には、処理を続けます。

あなたはラインでミリメートル番目の位置に立っています。プロセスを開始する前に、(一人一人の彼自身の選択のために、必ずしもすべての人々のために一致しない行の異なる人々をKKまで選び、常に最初または自分の順番に配列の最後の要素のいずれかを取るためにそれらを説得します)、何の要素自体が何であるかは関係ありません。プロセスが開始されたら、任意のより多くの人々を説得することはできません、とあなたはすでに説得人々のための選択肢を変更することはできません。

あなたが最適な選択肢をやっていると仮定します。このように関係なく、あなたがコントロールに選択しなかった友人の選択肢が何であるか、という、要素はあなたがXXに等しいより以上になる配列からなりますXXの最大の整数は何ですか?

ノートあなたがコントロールしていない友人は任意に彼らの選択を行うことができ、彼らは必ずしも利用できる最大の要素を取っていないだろうしてくださいということ。

入力
入力は、複数のテストケースから構成されています。テストケースの数-最初の行は、単一の整数TT(1≤t≤10001≤t≤1000)を含みます。テストケースの説明は次の通りです。

各テストケースの最初の行三スペースで区切られた整数にnn含ま、MMおよびKK(1≤m≤n≤35001≤m≤n≤3500、0≤k≤n-10≤k≤n-1) - 数配列内の要素、あなたの行に位置し、選択肢あなたが修正できる人の数の。

配列の要素 - 各テストケースの2行目は、NN正の整数A1、A2、...、ANA1、A2、...、(1≤ai≤1091≤ai≤109)を含みます。

すべてのテストケースの上にNNの合計が35003500を超えていないことが保証されています。

出力
各テストケース、最大の整数を印刷するためには、あなたが少なくともXXで得ることを保証することができるようにxxを。

例えば
入力
4
6 4 2
2 9 2 3 8 5
4 4 1
2 13 60 4
4 1 3
1 2 2 1
2 2 0
1 2
出力
8
4
1
1

最初のテストケースでは、最適な戦略は、強制的にです最初の人は、最初の要素を取るために最後の要素と二人目を取ります。

彼または彼女は最後の要素を取るためにあなたによって強制されたため、最初の人は、最後の要素(55)がかかります。このターンの後に残った配列が[2,9,2,3,8]、[2,9,2,3,8]であろう。
彼または彼女は最初の要素を取るためにあなたによって強制されたので、二人目は、最初の要素(22)がかかります。このターンの後に残った配列が[9,2,3,8]、[9,2,3,8]であろう。
三人は最初の要素(99)を取ることを選択します場合は、あなたのターンで残りの配列は次のようになります[2,3,8]、[2,3,8]、あなたは(最後の要素)を88になります。
三人は最後の要素(88)を取ることを選択します場合は、あなたのターンで残りの配列は、[9,2,3]、[9,2,3]になり、あなたは99(最初の要素)がかかります。
したがって、この戦略は、我々は保証が故に、少なくとも99で終わるするという戦略がないことを証明することができる88少なくともで終わるために保証し、答えは88です。

第二のテストケースでは、最適の戦略は、第2および第3の人物の両方が最初の要素を取る:.あなたは44で終わるだろう、最悪の場合には、その後、最初の要素を取るために最初の人を強制することです
だけでなく話題の思考!
質問の意味:nビットの総数を、Iは、第mビットに来ました。デジタルのみの最初または最後のビットを取るために時間を取るために皆を取得する最初の人から始まるn個の数字があります。今、私が最初か最後を取るのk他人を説得するチャンスを持っています。Qデジタル私は最終的に得た、最大値はどのくらいになってしまうことができるのだろうか?(最初のサンプルのように、我々は8を取得する、9取得する可能性がある)
アイデア:欲を見ることができ、より多くの人々を確信し、結果が良くなります。そして、より多くの前方の人を納得させる、結果が良くなります。より前方にあるため、より多くのあなたは、より良い起こる彼らのために手配することができます。k個の可能性の合計は、我々は分(M-1、k)の可能性を使用します。それは、彼らがN-M + 1つの数字、メートルの合計この場合、残りしなければならない、取るに私の番です、私たちは(あなたはまた、前処理を行うことができます)プリアウト可能な答えを進めることができます。Kは、その個人のために、そしてそこに正面から取得し始めて、だけでなく、我々は最高のを見つけるために横断する必要が戻ってから取るようになっています。データの量は、O(N * N)が許容されることができます。
私は間隔は、[I + 1であるために選択することができるように、我々は、私、私は個人的に正面から取り始め、その後、KIの残りの部分は後ろから個人取るようになったことを前提としていますが、M-K + 1人が制御されていないがあります+ 1 + M-K + 1 ] この段落。そこにこのセクションで答えを見つける最小を取ることが可能です。なぜそのM-K + 1人が制御されていないので、最小を取るので、我々は最悪の場合を考慮しなければなりません。しかし、その1つのサイクルのための私に、私たちは自分に有利条件にある最大値を、取らなければならないので、自主的な制御下にあります。
コードは以下の通りであります:

#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int maxx=4e3+100;
int a[maxx];
int n,m,k;

int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d%d%d",&n,&m,&k);
		memset(a,0,sizeof(a));
		for(int i=1;i<=n;i++) cin>>a[i];
		int ans=0;
		k=min(k,m-1);
		for(int i=0;i<=k;i++)//枚举可以控制的人中取左端的人数 
		{
			int ans1=1e9+100;
			for(int j=i+1;j<=i+m-k;j++)
			{
				ans1=min(ans1,max(a[j],a[j+n-m]));
			}
			ans=max(ans1,ans);
		}
		cout<<ans<<endl;
	}
	return 0;
}

ああを給油する、(O)/〜

公開された426元の記事 ウォン称賛24 ビュー30000 +

おすすめ

転載: blog.csdn.net/starlet_kiss/article/details/104293584