您的位置:首页 > Web前端

FOJ 1656 How many different numbers

2009-08-02 19:28 274 查看
http://acm.fzu.edu.cn/problem.php?pid=1656

题目大意:给你一组数,将他们放入数组中。之后给你若干个数组下标区间,求出这个区间中有多少个的不同数值。

解题思路:定义一个结构体A,含有数据成员locate,value,分别用来记录该组数据的值和所在位置。之后用sort函数按照value值从小到大排序。再定义一个数组B,以结构体A的locate值为下标进行编号,同样的元素编号相同,不同元素编号不同。再定义一个数组C,用来标记在系统给定的区间内,起初C数组元素初始化为0,以B数组元素为C的下标,注意哦,B数组元素是A结构体各个的编号哦,如果B[i]元素的一样,则说明值一样,否则就是不一样的。最后输出结果就是了。

#include <iostream>
#include <algorithm>
using namespace std;

class num
{
public:
int locate; /*记录该数值在数组中的下标*/
int value;/*数值*/
}a[100001];

bool cmp(num x,num y)
{
return x.value<y.value;
}

int main()
{
int NumOfValue;
int NumOfTest;
int S,T;
int count;
register int i,j,k;
while (scanf("%d",&NumOfValue)!=EOF)
{
for (i=1;i<=NumOfValue;i++)
{
scanf("%d",&a[i].value);
a[i].locate = i;
}
sort(a,a+i,cmp);
int t=0;
int B[100001];  /*用来给结构体中的元素进行编号*/
/************************************************************************/
/*                                  编号                                */
/************************************************************************/
B[a[0].locate] = 0;
for (j=1;j<=NumOfValue;j++)
{
if (a[j].value == a[j-1].value)
{
B[a[j].locate] = B[a[j-1].locate];
}
else
{
t++;
B[a[j].locate] = t;
}
}
int C[100001];/*标记是否访问过,访问过则代表与之前的某个元素是同一个元素*/
scanf("%d",&NumOfTest);

for (j=0;j<NumOfTest;j++)
{
count = 0;
memset(C,0,sizeof(C));
scanf("%d%d",&S,&T);
for (k=S;k<=T;k++)
{
if (C[(B[k])] == 0)
{
count++;
C[(B[k])] = 1;/*标记为1,这样相同元素的值就会被过滤掉,算出的count就是不同元素个数*/
}
}
printf("%d/n",count);
}

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: