hdu acm 1029

2014-11-24 02:03:02 · 作者: · 浏览: 2

这题有三种解法:

1.利用hash表

2.先排序,然后通过一次遍历,找出最长子串。

下面详细介绍一下第3种方法:

先看源代码:


[cpp] #include

int main()
{
int ans, num, count, n;
while (scanf("%d", &n) != EOF)
{
count = 0;
for (int i=1; i<=n; i++)
{
scanf("%d", &ans);
if (count == 0)
{
num = ans;
count ++;
}
else
if (ans == num)
count++;
else count--;
}
printf("%d\n", num);
}
return 0;
}

#include

int main()
{
int ans, num, count, n;
while (scanf("%d", &n) != EOF)
{
count = 0;
for (int i=1; i<=n; i++)
{
scanf("%d", &ans);
if (count == 0)
{
num = ans;
count ++;
}
else
if (ans == num)
count++;
else count--;
}
printf("%d\n", num);
}
return 0;
} 解释:这题比较特殊,根据题意数目最多整数的个数是大于等于N/2+1,也就是会超过其他整数的个数之和。

count保存的是目前出现次数最多的整数 减去 其他整数的个数。由于总个数为奇数,结果count一定>=1。