トピックリンクします。https://codeforces.com/problemset/problem/1203/E
問題の意味:数Nが与えられると、各変換は、互いに異なる数のデジタル部分に変換した後、適切なにより数N Q、+1または-1(変更できる)後に行うことができます。
それはまだ弱い鶏富栄のTi INGです。この質問は限り注意する貪欲、貪欲なことは、既存の値に直接、各値の後ストレージの数のマークをヒットしないように、ライン上にあります。なぜ?容易にするために、後に移動:のような、考慮にいくつかの特殊なケースの存在を取ります
番号:1234567
番号:2110112
我々は、元の2,3- 3,4 +1全体を変更した場合、この例のために、1プラス1しながら、この列の数が異なる7があり、空のパッチ4に置くことができますあなたはマークを築くために開始した場合の数は、しかし、それは我々がこのような動きをすることができないことを意味します。そして、この動きは貪欲な実装です。
特定の実装では、単に、ワード1から150000から、例えば、貪欲な側面を開始する場所にいる側の第1の各値を覚え、小から大へ、または大から小まで、マーキングVIを構築する別の配列を横断することが可能ですそれには、VIS、VIS言葉が彼らの価値の位置をマークするようになっていない持っている1未満参照してください。最後に、再びラインの完全な統計出力をマーク。
1の#include <iostreamの> 2の#include <cstdioを> 3の#include < 設定 > 4の#include <stdio.hに> 5の#include < 文字列・H> 6の#include <math.h>の 7の#include <ベクトル> 8# <STDLIB.H>含む 9の#include <キュー> 10の#include <アルゴリズム> 11の#include <地図> 12の#include <積層> 13 使用 名前空間STDを、 14 INT N。 15 INT [ 150010 ]。 150010 ]。 17 のint main()の 18 { 19 のscanf(" %d個"、&N) 20 int型K; 21 INT S = 0 。 22 のために(int型 I = 0 ; iがN <; Iは++ ) 23 { 24 のscanf(" %dの"、&K)。 25 [K] ++ ; 26 } 27 のための(int型 i = 1 ; iが= < 150000を;私は++ ) 28 { 29 であれば([I]) 30 { 31 のために(INT J = I- 1、J; <= I + 1、J ++ ) 32 { 33 であれば([I] && J> 0!&&をVIS [J ]) 34 { 35 VIS [J] = 1 。 36 [I] - 。 37 } 38 } 39 } 40 } 41 用(int型 i = 1 ; iが<= 150001を、私は++ ) 42 { 43 であれば(VIS [I]> 0 ) 44 { 45の S ++ 。 46 } 47 } 48 のprintf(" %d個の\ n " 、S); 49 リターン 0 ; 50 }