配列の並べ替え回数
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整数で、配列中のこの数字の出現回数を表します.
サンプル入力:
4
思想:二分法を使って具体的な数字の位置を探して、それから前後にスキャンして数字の個数を確定します.
コードAC:
テーマの説明: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;
}