配列の並べ替え回数

2769 ワード

何海涛:『剣指Offer:有名企業面接官精講典型的プログラミング問題』:9度OJ
テーマの説明:http://ac.jobdu.com/problem.php?cid=1039&pid=20
並べ替えられた配列の数を統計します.
入力:
各テストケースには2行が含まれています.
最初の行には1つの整数nがあり、配列のサイズを表しています.1<=n<=10^6
第二行はn個の整数があり、配列要素を表し、各要素はintである.
3行目は1つの整数mがあり、次にm回の検索があることを示しています.1<=m<=10^3
下にm行があります.各行に整数kがあります.クエリーの数を表します.
出力:
各テストケースに対応して、m行出力があり、1行1整数で、配列中のこの数字の出現回数を表します.
サンプル入力:
8
1 2 3 3 3 3 4 5
1
3
サンプル出力:
           4
思想:二分法を使って具体的な数字の位置を探して、それから前後にスキャンして数字の個数を確定します.
コードAC:
//  2  !! ^_^

#include <stdio.h>
#include <stdlib.h>

int main()
{
    long int n, i, cou, mid, low, high;
    int  m, *num, k;
    
    while( scanf( "%ld", &n ) != EOF )
    {
           num = ( int* )malloc( sizeof( int ) * n );
           
           for( i = 0; i < n; i++ )
           {
                scanf("%d", &num[i]);
           }
           
           scanf("%d", &m);
           
           while( m-- )
           {
                  scanf("%d", &k);
                  
                  low = 0;
                  high = n - 1;
                  while( low <= high )
                  {
                         mid = ( low + high ) / 2;
                         if( k == num[mid] )
                         {
                             break;
                         }
                         else if( k > num[mid] )
                         {
                              low = mid + 1;
                         }
                         else
                         {
                             high = mid - 1;
                         }
                  }
                  
                  cou = 0;
                  i = mid;
                  while( i < n )
                  {
                         if( num[i] == k )
                         {
                             cou++;
                             i++;
                         }
                         else
                         {
                             break;
                         }
                  }
                  
                  i = mid - 1;
                  while( i >= 0 )
                  {
                         if( num[i] == k )
                         {
                             cou++;
                             i--;
                         }
                         else
                         {
                             break;
                         }
                  }
                  
                  printf("%d
", cou); } } return 0; }