2019安徽レース問題解決

A.ロボットサッカー

シミュレーション

 

書式#include <iostreamの> 
の#include <cmath> 
の#include <cstdioを> 
使用して名前空間std; 

二重DIS(INT X1、Y1 INT、INT X2、Y2 INT){ 
	戻りSQRT((X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2))。
} 

int型のmain(){ 
	int型X、Y。
	scanf関数( "%dの%のD"、およびX&Y)。
	ダブルD = DIS(X、Y、100,10)-10。
	printf( "%3LFする\ n"、MAX(D、0)); 
}

 

 

 

B.識別カード

シミュレーション

 

書式#include <iostreamの> 
の#include <cstdioを> 
する#include <設定> 
名前空間stdを使用。
typedefのペア<int型、int型> PII。

チャーX。
yはint型。
INT [200]。
<PII>の設定。

INTメイン(){ 
	[ 'P'] [ 'K'] 13 = [ 'T'] = [ 'Hを'] =を=。
	一方、(〜のscanf( "%のC%dの"、およびX&Y)){ 
		IF(s.count(PII(X、Y)))戻りプット( "GRESKA")、0。
		s.insert(PII(X、Y))。
		- 斧]; 
	} 
	のprintf( "%D%D%D%D \ n"、[ 'P']、[ 'K']、[ 'H']、[ 'T'])。
}

 

 

C.カード対決

貪欲、$ \のFAC前に{n}が{2} $の最大のフィールドを取得しようと、$ \ FRAC {n}が{2} $のコース最小を取得しよう。

 

#include <iostreamの> 
する#include <アルゴリズム> 
の#include <cstdioを> 
する#include <設定> 
の#define REP(I、N)のための(iは= int型; I <= N; ++ I)
名前空間stdを使用。
CONST int型N = 1E5 + 10。
整数nを、[N]。
セット<整数>ボブ、アリス。

INTメイン(){ 
	scanf関数( "%のD"、&N); 
	REP(I、1、N){ 
		scanf関数( "%dの"、A + I)。
		Bob.insert([I])。
	} 
	REP(I、1,2 * n)でAlice.insert(I)IF(Bob.count(I)!)。
	int型ANS = 0; 
	ソート(+ 1、A + 1 + N / 2、より大きな<整数>()); 
	REP(I、1、N / 2){ 
		int型のx = *( - Alice.end())。
		IF(X> [i])と++ ANS、Alice.erase(X)。
	} 
	ソート(A + 1 + N / 2、+ 1 + N)。
	REP(I、1、N / 2){
		IF(X <[I])++ ANS、Alice.erase(X)。
	} 
	のprintf( "%d個の\ n"、ANS)。
}

 

 

車でお越しのD.

2ダイクストラ決定した開始と$ N $の各ポイントへの最短、図は$ 1-を決定し、実行ダイクストラを構築するために> N $は最小が最短となります。

 

#include <iostreamの> 
する#include <cstdioを> 
する#include <キュー> 
の#include <string.hの> 
に#define REP(I、N)のための(iは= int型、iが<= N; I ++)
の#define PBの一back 
名前空間stdを使用。
typedefの長い長いLL。

CONST int型N = 5E4 + 10。
N INT、M。
構造体_ {WにINT;}; 
ベクター<_> G1 [N]、G2 [N]、G3 [N]。
LLさd1 [N]、D2 [N]、D3 [N]。
INT VIS [N]、U [N]、V [N]、P [N]、Q [N]。
構造体ノード{ 
	int型のID。
	ワットLL; 
	ブール演算子<(constのノード&RHS)のconst { 
		Wリターン> rhs.w。
	} 
}。
PRIORITY_QUEUE <ノード> PQ。

ボイドをDij(ベクトル<_> G []、LL D []、int型の){ 
	memsetの(D、0x3fを、はsizeofのD1)。
	memsetの(VIS、0、はsizeof VIS)。
	pq.push({S、D [S] = 0})。
	一方、(pq.size()){ 
		。INT U = pq.top()ID。pq.pop(); 
		IF(VIS [U])続けます。
		VIS [U] = 1。
		(オート&E:G [U])のための{ 
			LL DD = e.w + D [U]。
			IF(DD <D [e.to])pq.push({e.to、D [e.to] = DD})。
		} 
	} 
} 

int型のmain(){ 
	scanf関数( "%D%dの"、&N、&M)。
	REP(I、1、M){ 
		scanf関数( "%D%D%D%D"、U + I、V + I、P + I、Q + I)。
		G1 [V [I] PB({U [I]、P [I]})。
		G2 [V [I] PB({U [I]、Q [I]})。

	} 
	をDij(G1、D1、N)
	Dij(G2、D2、N)
	REP(I、1、M){ 
		int型C = 0。
		IF(D1 [V [I] + P [I]> D1 [U [I])、C ++、
		IF(D2 [V [I] + Q [I]> D2 [U [I])、C ++、
		G3 [U [I] PB({V [i]は、C})。
	} 
	をDij(G3、d3,1)。
	printf( "%LLDする\ n"、D3 [N])。
}

 

 

G.は、シーケンスを括弧しました

DP $ $ $ X $は、放電方式の数が「(」以上$ K $、次に置く場合、複数の$のY $番号スキームは、その後、前後に列挙されている右括弧は括弧を左よりも、長さが決定されます'('、そうでない場合は入れ ')'。

プログラムの数は指数関数的であることに注意してください、それは長い長いバーストします。

 

#include <入出力ストリーム> 
の#define REP(iは、、B)(iは= int型、iが= Bを<; ++ i)がため
名前空間stdを使用。
typedefの長い長いLL。

const int型N = 2010; 
N INT、K。
LL F [N]、[N]。
チャーANS [N]。

INTメイン(){ 
	scanf関数( "%d個の%のD"、&N&K)。
	F [0] [0] = 1。
	LL INF = 1E18 + 10。
	REP(I、1、n)のREP(j、0、N)の場合(F [I-1]〜[J]){ 
		F [I] [J + 1] + = F [I-1]〜[J]。
		もしF [I] [J-1] + = F [I-1]〜[J](J)。
		F [I] [J + 1] =([I]、[J + 1]、INF F)分。
		F [I] [J-1] =分(F [I] [J-1]、INF)。
	} 
	= 0今int型。
	REP(I、1、N){ 
		IF(F [NI] [今+ 1]> = K)ANS [I] = '(' ++今; 
		他ANS [I] = '')、K- = F [NI] [今+ 1]、 -今。
	} 
	プット(ANS + 1)。

 

 

H.ドゥ回文

含んでいなければならない大きなパリンドロームドローム小さい、唯一パリンドロームの長さは、図2及び図3に決定されます。

 

#include <iostreamの> 
する#include <cstdioを> 
する#include <string.hの> 
に#define REP(I、N)のための(iは= int型、iが<= N; I ++)
名前空間stdを使用。

CONST int型N = 1E6 + 10。
整数nを、[N]。
チャーS [N]。

INTメイン(){ 
	scanf関数( "%sの"、S + 1)。
	N = STRLEN(S + 1)。
	REP(I、1、N)[I] = sの[I]。
	int型ANS = 0、CUR = 0; 
	REP(I、1、N){ 
		IF([I] == A [I-1])++ ANS、[I] = - CUR。
		(I> = 2 && [I] == A [I-2])++ ANS、[I] =あれば- CUR。
	} 
	のprintf( "%d個の\ n"、ANS)。
}

 

 

I.あなたのお名前

文字列は他の列、バイナリの$ O(nlogn)$、または配列オートマトンの$ O(N \ Sigma)を$のサブシーケンスであるかどうかを決定します

 

おすすめ

転載: www.cnblogs.com/uid001/p/10987668.html