【题七】Water
泉州第一中学 刘家昌
题目名称 文件名 时间限制 内存限制
Water water.*{in,out,c,cpp,pas} 5s 8MB
题目描述
百度百科的「灌水」条目如此说道:
灌水的英文叫做「addwater」,根据网络耆老口耳相传,此乃与美国前任总统里根大有关系。据说里根是个 BBS 爱好者,在总统任内常喜欢利用电子布告栏微服出巡,了解民生疾苦;他也用「addwater」这个 ID 结交了不少网友。直到里根卸任之后,他才向几个好友透露这个事情,一时间内,攀关系的、有仇的等各种各样网友纷纷发 E-mail,post 给站长,悲哀的站长不好不看信,只能全盘接受了,终于,这个站被弄垮了。好像后来里根有补偿这位可怜的站长,就这样「addwater」的威名就传开了,传到台湾后,就形成了「灌水」。
而维基百科没有这样的介绍,笔者便不得不怀疑其真实性。Google~后,无论是「addwater」,「forum add water」,「bbs add water」或者是「Reagan(里根) addwater」都没有找到相关的内容。
除了无力吐槽网友无与伦比的想象力外,考虑这样一个与背景有(mei)不(pi)少(dian)联系的问题:
某「水王」发帖数目超过了帖子总数的一半。如果你获得一个当前论坛上所有帖子作者ID的输入(区分大小写),你能快速找出这个传说中的水王吗?
当然,这个论坛的帖子数在水王的狂轰滥炸后也(jing)只(ran)有五百万了而(wo)已(cao),你的系统管理员也只是不小心把你的内存资源配额的 8 GB 打成了 8 MB 罢了,而由于服务器 CPU 资源太宝贵,你的BOSS要求你的程序在5秒之内完成任务。
输入格式
测试点有多组数据,对于每组数据:
第一行一个正整数N。表示帖子数。
接下来N行,每行一个长度不大于10的字符串,表示一个帖子作者的ID。
测试点以0结束。
输出格式
输出仅一个字符串,表示「水王」的 ID。
样例输入
5
add_water
add_water
admin
helloworld
add_water
0
样例输出
add_water
数据规模
测试点 分值 N 测试数据组数
small 20 <=20 2
large 30 <=3,000,000 3
huge 50 <=5,000,000 5
保证「水王」发帖数严格大于半数。
保证字符串不包含空格和其他空白字符。
内存问题1:
定理1:若一个堆中某数出现次数过半,则任意删去2个不同的元素,该元素仍过半
#include<stdio.h> #include<string.h> int n,size; char s1[11],s2[11]; int main() { freopen("water.in","r",stdin); freopen("water.out","w",stdout); while (scanf("%d",&n)!=EOF&&n) { // printf("%d",n); size=0; while (n--) { scanf("%s",s1); if (!size) size++,strcpy(s2,s1); else if (!strcmp(s1,s2)) size++; else size--; // if (n==0) printf("%s",s1); } printf("%s\n",s2); } // fclose(stdin); // fclose(stdout); return 0; }