题意:
给一行数(2到15个),每个数都是比100小的正数。要找出这组数里头满足两个数之间是两倍关系的多少对。
输入:
每一行输入为一组,以0为每一组数的输入结束标识。用-1作为总的输入结束。
输出:
对于每一组数输出一个结果数,表示满足两倍关系的有多少对。
解题思路:
可以先把一组数从小到大排序,然后从最小的数的两倍开始往后找,若有两倍后相同的,说明这个数和前面的那个数有两倍关系;若一直找到这组数结束或者一直找到比两倍还大(所以后面也不可能有相同了,因为事先排序了),这就说明没有和这个数有两倍关系存在的数。
同时下一个数的两倍数,可以从上一个数的两倍还大的那个数作为起点,这样子可以减少遍历的个数。
AC代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int num[50];
int main()
{
int n;
int input;
//freopen("POJ1552.txt","r",stdin);
while(scanf("%d",&input))
{
if(input == -1)
break;
n = 0;
num[n++] = input;
for(int i = 0;i < 50;i++)
{
scanf("%d",&input);
if(input)
num[n++] = input;
else
break;
}
sort(num,num+n); //快排
int cnt = 0;
int l = 0;
int numDou;
for(int i = 0;i < n;i++)
{
numDou = 2*num[i];
for(int j = l;j < n;j++)
{
if(numDou < num[j])
{
l = (j-1 < 0)?0:j-1;
break;
}
if(numDou == num[j])
{
l = j;
cnt++;
break;
}
}
}
printf("%d\n",cnt);
}
return 0;
}