寻找水王

编程之美中寻找水王就是xoj 1054寻找黑客。
可以将整个数组排序,第n/2个即是答案。这样时间复杂度为o(nlogn),还要n的空间。
可以每次去除两个不同id的记录,这样去除的记录中水王的记录总是小于等于1/2,而总的当中水王记录大于1/2,那么剩下的记录中水王的记录也总是超过1/2,到最后剩下的记录就是水王了。
如果显示地删除记录的话,记录要全部保存,而且不能用数组保存,得用链表,因为经常删除,为了防止频繁调用new,free还应使用静态链表,这样实在太麻烦了。
可以隐式地删除,用一个变量保存未被不同ID抵消的记录,一个计数器保存其计数,就可以实现删除。最后保存的记录就是水王了。
xoj太慢了,不知道能否ac,先放上来。

#include
#include

int main(void)
{
int i,times,t = 1,n;
char ip[16],suspect[16];
for (; ;)
{
scanf("%d",&n);
if (!n)
{
return 0;
}

times = 0;
for (i = 0; i < n; ++i)
{
scanf("%s",ip);
if (!times)
{
strcpy(suspect,ip);
++times;
}
else
{
if (!strcmp(suspect,ip))
{
++times;
}
else
{
--times;
}
}
}

printf("Case %d:/n%s/n",t,suspect);
++t;
}
return 0;
}

对于xoj1054有一种简单做法,将ip看成4个0-255的整数,水王的ip分到各个段也都是出现最多的,因此只需要4个256的数组。

你可能感兴趣的:(寻找水王)