寻找水王

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

#include <cstdio>
#include <cstring>

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的数组。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值