サプライチェーン(25point(S))で1106年の最低価格簡単に一度だけ

基本的な考え方:

同様の問題は、それらを繰り返しません。

 

キーポイント:

ノー;

 

書式#include <iostreamの>
書式#include <stdlib.h>に含ま
書式#include <stdio.hに>
書式#include <ベクトル> 
書式#include <文字列>
書式#include <math.h>の
書式#include <アルゴリズム>
書式#include <CStringの>
書式#include <マップ>
書式#include <キュー>
名前空間stdを使用。


int型のn;
ダブルP、R。
ダブルエンド= 10000000;
int型CNT = 0;

構造体ノード{
	ベクトル<整数>子。
	int型層と、
}。

ベクター<ノード>ツリー。

ボイドlayer_init(){
	(tree.size()== 0)の場合
		リターン;
	ツリー[0] .layer = 0。
	キュー<整数> Q;
	q.push(0)。
	しばらく(!q.empty()){
		INTインデックス= q.front()。
		q.pop();
		以下のために(INT I 0 =; I <ツリー[インデックス] .child.size(); I ++){
			。ツリー[ツリー[インデックス] .child [I] =層ツリー[インデックス] .layer + 1。
			q.push(ツリー[インデックス] .child [I])。
		}
	}
}

ボイドlayer_find(INT N){
	ダブルK;
	IF(ツリー[N] .child.size()== 0){
		K = P * POW(1つの+ 0.01 * R、ツリー[N] .layer)。
		// coutの<< K <<てendl;
		{(K <フィン)場合
			端= K。
			CNT = 1。
		}
		そうであれば(K ==フィン){
			CNT ++;
		}
		リターン;
	}
	以下のために(INT I 0 =; I <ツリー[N] .child.size(); I ++){
		layer_find(ツリー[N] .child [I])。
	}
}

INTメイン(){
	CIN >> N >> P >> R。
	tree.resize(N)
	int型のA、B;
	{(; I <N I ++ INTがI = 0)するため
		cinを>>;
		用(INT J = 0; J <; J ++){
			cinを>> B;
			ツリー[I] .child.push_back(B)。
		}
	}
	layer_init();
	layer_find(0)。
	printf( "%4lf%D"、フィン、CNT)。
	0を返します。
}

  

おすすめ

転載: www.cnblogs.com/songlinxuan/p/12307364.html