[グループ]人気18NOIPを示します

説明[タイトル]
玄玄とカイカイキキと呼ばれるが、「メイト」のゲームをプレイしているボードゲームはラインで、隣接するライン上のNN兵舎は、(左から右に番号1〜N1〜n個)があり、 11センチメートル離れ兵舎の数、すなわち、基板セグメントの長さN-1N-1 cmの。IIそこ号兵舎遊泳ビット工兵。

1次の図は、n = 6N = 6の例です。
ここに画像を挿入説明

図実施例1のn = 6

玄玄は、左の「龍」の略で、カイカイキキ右に、代わって「トラ。」非常にもつれたエンジニアの番号ミリメートルの兵舎が、彼らはどの政党にも属していない間、彼らミリメートル号の兵舎を境界として、竜のエンジニアリング力の左側の部分は、虎は、エンジニアリング力の右に属します。

兵舎の勢いがある:××兵舎の数mmの兵舎から兵舎でのエンジニアの数、ゲームに参加する力の一つは以下のように定義されるこのパーティーや兵舎の勢いに属するすべて。

図2は、N = 6、M = 4N = 6、M = 4の例では、前記赤色ドラゴン正方形、黄色トラ側未満です。

ここに画像を挿入説明

図2、N = 6、M = 4N = 6、M = 4の例で

もちろんゲームの、瞬間Tianxiangshenbing総S1S1ビットエンジニアが突然数のp1p1の兵舎に登場します。甲斐甲斐玄玄と友人として、次の2つの辺の竜の勢いギャップがあまりにも悪く、甲斐甲斐玄玄が上がり続けるしたくない場合は知っています。ゲームを継続させるためには、あなたは兵舎のp2p2を選択する必要があり、そしてあなたの手の位置s2s2エンジニアは、すべての兵舎のp2p2に送られたので、可能な限り小さく両国間の勢い。

注:エンジニアた兵舎の手に上陸し、他のエンジニアの兵舎が(数はミリメートルの兵舎を低下した場合、いずれかの勢力に所属していない)既得同じ力を持っています。

[入力]
最初のライン入力は、正の整数NNを含む兵舎の数を表します。

起動時、次の行は、隣接する二つの数字の間の空間で、nnは正の整数が含まれ、エンジニアのII番号の数を表す第1の正の整数II兵舎を遊泳します。

次の行はM、P1、S1、S2M、P1、S1、S2を表し、隣接する二つの数字の間の空間では、4つの正の整数を含みます。

[出力]
出力の正の整数を含む行そのお好みのp2p2、表現兵舎番号。最小数を取って、最適な数が存在を満たす複数の場合。

[サンプル]入力
。6
2 2 3 3 2 3
4 5 6 2
[出力]サンプル
2
[注]
[サンプル1]説明

図で説明した問題を参照してください。両方のM = 4メートル= 4兵舎界に存在S1 = 5s1 = 5ビット工学突然P1 = 6P1 = 6兵舎登場しました。

ロング勢いは次のとおりです。

2×(4-1)+ 3× (4-2)+ 2×(4-3)= 142×(4-1)+ 3×(4-2)+ 2×(4-3)= 14
虎パーティーのために勢い:

2×(5-4)+(3 + 5)×(6-4)= 182×(5-4)+(3 + 5)×(6-4)= 18
あなたはS2 = 2S2 =を渡す場合2人のエンジニアがP2 = 2P2 = 2つの兵舎を送ったとき、肺の勢いは次のようになります。

14 + 2×(4-2)= 1814 + 2×(4-2)= 18
この場合には、同じ運動量共に。

サンプル入力[2]

6
。1 1 1 1 1 16
。5. 4. 1. 1
[2]サンプル出力

1
[2サンプル記述]

= 4つの兵舎M = 5メートル= 5兵舎境界がS1 = 1S1 = 1ビットエンジニア突然現れP1 =番号4P1の両方で。ロング勢いは次のとおりです。

1×(5-1)+ 1×(5-2)+ 1×(5-3)+(1 + 1)×(5-4)= 111×(5-1)+ 1×(5-2 )+ 1×(5-3)+(1 + 1)×(5-4)= 11虎側の勢いです。

16×(6-5)= 1616× (6-5)= 16
あなたが手場合は、S2 = 1S2 = 1ビットのエンジニアはP2 = 1P2 = 1兵舎を送信し、肺の勢いは次のようになります。

11 + 1×(5-1)= 1511 + 1×(5-1)= 15
この場合には、最小値を課すの両側の間に行うことができます。

スケールデータと[合意]

1 <M <N、1≤p1≤n1< M <N、1≤p1≤n
データの20%を、N = 3、M = 2 、CI = 1、S1、s2≤100n= 3、M = 2 、CI = 1、S1、s2≤100 。

データの別の20%、n≤100、P1 = M、CI = 1、S1、s2≤100n≤100、P1 = M、CI = 1、S1、s2≤100。

データの60%、n≤100、CI = 1、S1、s2≤100n≤100、CI = 1、S1、s2≤100。

データの80%、n≤100、CI、S1、s2≤100n≤100、CI、S1、s2≤100。

データの100%、n≤105、CI、S1、s2≤109n≤105、CI、S1、s2≤109します。

この問題は、非常に長いタイトルで、このアルゴリズムは、単純なシミュレーション、難しいことではありません!
それはする側のギャップを広げるだろうとs2可能性があるため、しかし、私は52ポイントをしていた最初の時間は、添字をmに初期化されて忘れて!5つのポイントの後ろに間違っている理由は、私はテーマを始めたときに私が覚えて、その後、提出はアイデアは確かに真実である、私は理解していないと思った、80点で、私はこれを実現し、低スコアを提出表示されます自分自身を思い出させるために時間が注意:提出は80であるデータ型は、長い長い使用する必要があり、私はそのデータ型をダブルチェックし、長い長い、私は理解したくないされています。
突然!独自のコードに瞬間を見て、我々はint型で、開放的な構造の中に発見しました!私がひざまずきます!
ここでは、コードのACです!(全く自分のアイデア)

#include<bits/stdc++.h>
using namespace std;
#define N 1000005
long long n, m, p1, s1, s2, l = 0, r = 0, ans = 0, sub, tmpl, tmpr;
struct node{
	long long num, dis;//必须开long long!
}a[N];
int main(){
	scanf("%lld", &n);
	for(int i = 1; i<=n; i++)
		scanf("%lld", &a[i].num);
	scanf("%lld %lld %lld %lld", &m, &p1, &s1, &s2);
	a[p1].num += s1;
	for(int i=1; i<=n; i++)
		a[i].dis = abs(i-m);
	for(int i=1; i<=n; i++){
		if(i < m)
			l = l + a[i].num * a[i].dis;//龙的势力
		else if(i > m)
			r = r + a[i].num * a[i].dis;//虎的势力
	}
	long long tmp = abs(l - r);
	if(tmp == 0){
		cout << m;
		return 0;
	}
	sub = m;//下标初始化为m,因为可能s2放在哪边都会拉大差距!
	for(int i=1; i<=n; i++){
		if(i < m)
			ans = abs(r - l - s2 * a[i].dis);
		else
			ans = abs(l - r - s2 * a[i].dis);			
		if(ans < tmp){
			tmp = ans;
			sub = i;
		}
	}
	printf("%lld", sub);
	return 0;
}
公開された15元の記事 ウォン称賛10 ビュー199

おすすめ

転載: blog.csdn.net/qq_39053800/article/details/104255547