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)を$のサブシーケンスであるかどうかを決定します