ACMテクニック


1.一般的にC言語でスペースを節約し、C++ライブラリ関数やSTLを使う場合にC++を使う.cout、cin、printf、scanfは混用しないほうがいいです.
ビッグデータの入出力ではcin、coutを使わずにタイムアウトを防ぐことが望ましい.
2.int型が足りない場合はlong longまたは_int 64型(2つの下線_).
値タイプは、-2^63(-922337203685475808)~2^63-1(+922337203685475807)の整数を表します.
printf("%I64d",a); //__int 64一般VCコンパイラ使用
printf("%lld",a);//long long一般g++コンパイラ使用
3.OJは出力結果のみを見たと判断した.
したがって,大部分の問題は1組のデータを処理した後に直接出力することができ,各Caseのデータを配列で保存する必要はない.
while(Case--)
{
        scanf(...);
        ......
        printf(...);
}

4.純文字列はputs()で出力されます.
データが大きい場合はscanf()、printf()で時間を減らすことが望ましい.
まずscanf()を使い、gets()でリターンを読み込みます.だから真ん中にgetchar()を追加します.
scanf("%c%c",&c 1,&c 2)はスペースを読み込みます.%sで文字列を読み込み、最初の文字を取ることをお勧めします.
5.ファイルの最後まで読み、プログラムは自動的に終了する
while((scanf(“%d”,&a)) != -1)
while((scanf(“%d”,&a)) != EOF)
while((scanf(“%d”,&a)) == 1)
while(~(scanf(“%d”,&a)))
0を読むとプログラムは終了します
while(scanf(“%d”,&a) ,a)
複数の0を読み取るとプログラムは終了します
while(scanf("%d%d%d",&a,&b,&c),a+b+c)/a,b,c非負
while(scanf(“%d%d%d”,&a,&b,&c),a|b|c)
6.配列定義int a[10]={0}すべての要素に0を割り当てることができます.
配列が大きすぎてそうしないで、CEを防ぐ.
グローバル変数、静的変数は自動的に0に初期化されます.
7.多くの数学の問題は規則的で、直接公式を押すか、再帰、循環を使う.
8.円周率=acos(-1.0)自然対数=exp(1.0)
9.2^nを乗算または除去する場合は、シフト演算速度が速い.a>>n;a<10.配列を定義する場合、配列のサイズは、指定した最大範囲よりも大きくすることが望ましい.
文字配列のサイズは、文字列の最大長より1大きくなければなりません.
文字配列を処理するときは、最後に'/0'または0を付けることを忘れないでください.
 11.三項演算子の使用
int max(int a, int b)
{
        return a > b ? a : b;
}
int gcd(int m, int n)
{
        return n ? gcd(n, m % n) : m;
}
int abs(int a)
{
        return a < 0 ? -a : a;
}

12.乗算を加算減算時間に変換する
log(a*b)=log(a)+log(b)
乗算を除算に変換してオーバーフロー防止
a/(b*c)=a/b/c
 13.ソート要求が高くない場合はC++のSTLテンプレート関数sort(),stable_sort()
int a[n] = {...};
sort(a, a + n);
bool cmp(int m, int n)
{
        return m > n;
}
sort(a, a + n, cmp);

 14.ある問題はデータ範囲が小さいが計算量が大きいので表を打つことができる.
まず結果を算出して配列に保存し、使うときに直接取り出します.
 15.浮動小数点数比較時の制御精度が望ましい
#define eps 1e-6
fabs(a-b) < eps
16.一部の文字列と整数型の変換関数は非標準的である
代わりにsscanf()とsprintf()を使用できます.
sscanf(s, "%d", &n);   //    s     n
sprintf(s, "%d", n);   // n      s