ASDFZ 3633 - 地層

説明

9102の小さなXは、シミュレーションの質問のこのセットの主人公も、年生OIerに住んでいます。
これは、過去のある......
小さなXの形成がゲームをプレイしている、この時間は、小さなRは突然、彼女の小さなXで再生するために出てきました
だから、このゲームにはほとんどXはあなたを投げ、私はあなたがどれだけ彼らの連勝壊れたか分からないのを防止するための最適な戦略を見つけ、彼を助けることができると思います。
N 2人のプレイヤーはこれらの城のために競争するために、各ラウンドの対戦ゲームでは城があります。各プレイヤーは、m個の兵士がメートルを超えていない兵士の総数は、城を戦うために、AI I-城に兵士を送ることができます。
プレイヤーは兵士を送信する相手の倍数よりも厳密に大きい兵士城のi座席の番号に送信されている場合、このプレイヤーが城を占領し、私はポイントを得ます。
今、あなたはSと他の選手二十から二戦争に行っている、それは決闘派遣兵士のスキームは同じでなければなりませんね。使用して、あなたを教えてくれます他のプレイヤーの名前戦略は、あなたが自分のスコアを最大化するための戦略を使用する必要があることを何らかの方法で小さなX。
プログラムが一意ではないかもしれないので、あなただけのから抜け出すことができる最大をエクスポートする必要があります。

入力

データは標準入力から読み込まれます。
最初の行の入力は3つの正の整数、S、N、Mを含有する、兵士それぞれの数は、プレイヤーの数、城の数を表し、各プレイヤーは小さなXに加えて有します
プレイヤーは、i番目の城の兵士に送られ、i番目のAIの数を表し、プレーヤーの戦略を表すnは負でない整数の次の行。

出力

標準出力に出力します。
あなたが得ることができる最大スコアを表す出力ライン非負の整数。

サンプル入力

#1
1 3 10
2 2 6

#2
2 3 10
2 2 6
0 0 0

サンプル出力

#1〜
3

#2
8

サンプル解説

#1
最善の戦略の一つは、最初にある 1つの城や、それぞれ2つの城送る5 人の兵士を。

#2の
最初のための最適なポリシー1 城を送信するために、最初の2人の兵士を2つのディスパッチ城5人の兵士、第ディスパッチシート3城1人の兵士。

ヒント

データの10%、すなわちS = 1、n≤3、m≤10を確保します。
データの20%、すなわちS = 1、n≤10、m≤100を確保します。
データの40%については、n≤10、m≤100を確保します。
データの他の20%、つまり= 1秒確実にします。
データ100の場合は、確実にするために
  • 1≤s≤100
  • 1≤n≤100
    - 1≤m≤2×10 ^ 4
  • 各プレイヤーのために、ai≥0、

一定の係数の時間複雑そのプログラムノートの実際の効率に影響を与えてください。

ソース

トレーニングの前に2019NOIP

考え

FIJ前に表現するために選択されたの城は、jは使用されてきた得点するために利用できる兵士の最大数を。各お城の直接の列挙は、数人の兵士効率を送る場合はO(NM ^ 2)であるが、我々はちょうど才能の上には合計スコアの増加を獲得することができますので、私たちは、少数の人々はすべての城を勝つ列挙検討することができ、効率がなりましたO(NMS)

コード:

 

#include <cmath> 
の#include <cstdioを> 
する#include <CStringの> 
する#include <iostreamの> 
する#include <アルゴリズム> 
名前空間STDを使用して、

CONST int型N = 110、M = 20010。

INT [N] [N]。
INT S、N、M、F [M]。

INTメイン(){ 
	scanf関数( "%D%D%D"、&S、&N、&M)。
	以下のために(INT i = 1; iが= Sを<; I ++)
		のための(INT J = 1; J <= nであり、j ++){ 
			scanf関数( "%d個"、&[J] [I])。
			[J] [I] [J] [I] + 1×2 =。
		} 
	のために(iは++; iがn = <I = 1 INT)
		ソート([I] + 1、[I] + 1 + S)。
	<;のために(iは= N I ++ i = 1 INT)
		(; = 0; j--にint J = M-1 J)> 
			ための(int型のk = 1; K <= Sであり; kは++){ 
				IF(A [I] [K] + J> M)
					ブレーク。
				F [i]が[K] + J] = MAX([I] [K] + J]、F [J] + K * I F)。
			}
	int型ANS = 0; 
	以下のために(INT I = 1; I <= M; iは++)
		ANS = MAX(ANS、F [I])。
	printf( "%d個の\ n"、ANS)。
	0を返します。
}

 

 

 

 

おすすめ

転載: www.cnblogs.com/mysh/p/11456531.html
おすすめ