B - ポリゴン内ミスターBと角度
計算幾何
問題の意味
N入力各点の間の点は、n角形を作成するために、ザが互いに接続されている(図の例に示すように)、∠A角の所定の角度に最も近い3つの頂点A、Bを決定し、C前記Bが頂点です。
問題の解決策
私は、コードで難しい問題ではありませんが、あまりにも見逃せないこのタイトル、下のアイデアについてお話しましょう。N角形と内角は(N-2)* 180° 、 この式は、自然に覚えました。 しかしながら、それはいくつかの他の彼らが望む点、次のように概説した考えである N角形の各頂点の大きさ(N-2)* 180 / N° 任意のn角形の頂点のペアを除去しますそれ自体が2つの隣接する頂点は、頂点に固定することができ、残りの(N-3)(N-3)を対角頂点角に対応する対角頂点を分割することができる頂点に接続されました(N-3)+1、すなわち、(N-2)番目のセクションは、それぞれ180 / N°は 次に3つの頂点の範囲内の任意の角度でのn角形、それが由来する180 / N°〜180 *( nは-2)/ N°
便宜出力、ブログ上の問題に対する多くの解決策のために、頂点は、固定され、答えが目標角度に対応し、頂点関係の第3の数をより容易に発現させることができるように、実施例21のために、固定、2つのフロント定着に基づいています抜けます
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 INTメイン(int型 ARGC、チャー CONST * ARGV []) { int型N; CIN >> N >> ; 二重 TMP = 180.0 *(N - 2)/ N。 二重 ANG =(180.0 - TMP)/ 2 。 ダブル angs = ANG。 INTの ID = 3 。 以下のために(int型 I = 4 ; iが++; iが<= N ){ ダブル ANS = 1.0 *のANGの*(I - 2 ); もし( - A)> ABS(ANS - ABS(angs A)){ angsの =のANS。 ID = I; } } COUT << " 2 1 " << ID << ENDL。 リターン 0 ; }
C - ミスターBとPRシフト
現在のアレイのCNTを記録する[I]標識NUM NUMに位置[i]の位置は、サブ合計は次のシフト値を表すであろう、数回周期的に2つの変数が追加、右方向にシフトしている+ 1 / -1数は、各アップデートは、配置に基づいて行われます。
最初の質問は、1 <= [I] NUM <= N、意図されていることに留意されたいです。
NUM [I] = = 0またはNUM [I] nを、その他の場合は1からNUMに[i]はこれを見ていない、再びその数の各位置について、設定されているNUM [I]を注右への単一のダウンNUMから[I] nをインターバル期間、NUM [i]のように| | LOC - NUM [I] |番号[I] - LOC |間隔、NUM [i]は右になるようにモノサイトゲネス、用NUM 1からnまでの[I] = 0、| NUM [I] - LOC | あっモノサイトゲネス; numの[I] = N、NUM [i]は右になるよう|番号[I] - LOC |単一の保存;場合NUM [i]はnは1から移動し、増減しないことができます。だから、それぞれの番号num [i]のため、位置numは[i]のターニングポイントは、次のステップを決定し、だった|番号を[I] - LOC |どのように変化(それぞれ+1または-1)。具体的なアイデアは、注を参照してください。
// 264msの/の2000ミリ秒:CodeForces 820DミスターBとPRは/限制运行シフト する#include <cstdioを> する#include <CStringの> の#include <アルゴリズム> 書式#include <iostreamの> の#include <cmath> 使用して 名前空間はstd; #define INF 0x3f3f3f3f の#define LL長い長い INT num個の[ 1000005 ]、CNT [ 1000005 ]。 INT のmain(){ int型のn; int型、サブ、インデックスを追加します。 LL和、再; しばらく(scanf関数(" %d個"、&N)!= EOF){ 合計 = 0 ;追加= 0 ;サブ= 0 ; のmemset(CNT、0、はsizeof (CNT)); のための(INT I = 1 ; I <= N; I ++ ){ scanfの(" %のD "、&NUM [I ]); SUM + = FABS(NUM [I] - I)、 CNT [(NUM [I] - + N-I)のN-%] ++; // 標識CNT:位置をnum NUMに電流[I] [i]が所望の位置は、いくつかのシフト IF(NUM [i]が> I)サブ++; // の-1次回数シフト値 他の追加++; // 次は+1の値をシフトします番号 } 再 = SUM;インデックス= 0 ; のための(INT I = 1 ; I <N-; I ++){ // 前処理に基づいて、各シフトは、iが第1移動時間である SUM + =追加-サブ- 。1 ; // この最後のものは、それが追加計算されるまで、確かにNを満たすより少ない数(N-データ範囲が最大である)である;しかし、それは必ずしも追加されていない、ため、最初の場所に移動し、減算 和+ =(NUM [N -私は+ 1。 ] - 1。 )- (N - NUM [私は+ N - 1。 ]); // 最初の合計値への最後の移行における電流変化を計算し; // 、毎回本当に移動しませんが、位置が計算シーケンスシフトしてはならないすべての最後の1 //が完全合計を求めるには、倍の同等の移動 //この動きの結果は、次の更新された値は、サブが生じ、追加 // この時間の後に最初の位置まで移動するための追加よう-1通常、サブ+ 1より単調は、逆ため-1、+1です。 // [I] = 1 NUMは、場合|番号[i]は- LOCは| 全体が単調増加、位置変化単調性からn位置が特殊なケースであり、下記式NUM [N] = 1を満足を分析することができサブ 追加を=追加+ CNT [I] - 1。; 副 =サブ- CNT [I] + 1 ; IF(SUM < Re)が{ 再 = SUM; 指数 = I; } } のprintf(" %LLD%D \ N- " 、RE、指数); } 戻り 0 ; }
E - 岡部とバナナの木
列挙Y、演算シーケンスの総和
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 INTメイン(int型 ARGC、チャー CONST * ARGV []) { // Y = -x / M + B 長い 長M、B。 CIN >> M >> B。 長い 長い MAXX = 0 ; 以下のために(int型 I = bを、I> = 0 ; I - ){ 長い 長い和= 0 。 長い 長いボーダー= M×(B - I)。 合計 =((ボーダー+1)*境界/ 2)*(I + 1)+(I *(I + 1)/ 2)*(ボーダー+ 1 )。 もし(合計> MAXX)MAXX = 和。 } COUT << MAXX << ENDL。 リターン 0 ; }
F - 岡部とボックス
ソートが空==ないベクター:思考、ベクトルは、どのようなポイントをシミュレート
#include <ビット/ STDC ++ H> 使用して 名前空間STDを、 std ::ベクトル < 整数 > V。 INTメイン(int型 ARGC、チャー CONST * ARGV []) { int型N; cinを >> N; int型 CNT = 0、ANS = 0 ; 文字列strの。 一方、(CIN >> STR){ // CNT ++。 もし(STR [ 0 ] == ' A ' ){ int型のX; CIN >>バツ; v.push_back(X)。 } 他{ CNT ++ 。 もし(!v.empty()) であれば(v.back()== CNT)v.pop_back(); 他 v.clear()、++ ANS ; } } COUT << ANS << ENDL。 リターン 0 ; }