SOJ--4389: 川大贴吧水王

描述

_L的室友HZ喜欢在川大贴吧上发帖,据传说,HZ在川大贴吧上发的贴子数已经超过了该贴吧贴子总数的一半,被江湖人封为川大贴吧水王,你能帮_L迅速找出这位川大贴吧水王HZ的ID吗?

已知川大贴吧贴子总数为n,给出n个贴子作者的ID,求HZ的ID。

Input

输入文件包含多组测试数据。第一行为测试的数据组数T(T<=40)。

接下有T组数据,第一行输入贴子总数n(1<=n<=10000000),接下来的一行有n个正整数,分别为每位贴子作者的ID号(该ID号为不超过10^9的正整数)

Output

输出T行,每行为该组测试数据的川大贴吧水王HZ的ID。

Example Input

2

3

1 2 2

5

1 2 3 3 3

Example Output

2

3

Author

_L

解析:常规来看,可以对输入的id号进行排序,然后进行查找,但是看到总数n最大为10000000,猜想应该会超时,但是还是快速敲了代码测试了下,结果果然超时,所以这个暴力方法是行不通的

贴一下自己超时代码

#include<iostream>
#include<algorithm>
using namespace std;
//定义存放数据的数组,设值为全局变量
const int M=10000000+5;
int a[M];
int main()
{
	int T;
	//输入T组数据
	cin >> T;
	while(T--)
	{
		int n;
		cin >> n;
		//输入数据
		for(int i=0; i<n; ++i)
		{
			cin >> a[i];
		}
		//对输入的数组进行排序
		sort(a,a+n);
		//找出现次数大于n/2的id号
		int cnt=1, value=a[0];
		for(int i=1; i<n; ++i)
		{
			if(a[i]==value)
			{
				cnt++;
				//判断cnt是否符合条件
				if(cnt>n/2)
				{
					cout << value << endl;
					break;
				}
			}else{
				value=a[i];
				cnt=1;
			}
		}
	}
	return 0;
}

然后再仔细看题进行分析,题目中有个重要的信息就是所找的id号出现的次数大于总次数的一半,可以利用这个原理进行优化代码。

一次遍历数组就可以得到,利用两个变量 k 和 j 来保存中间的值,其中k保存每次比较的值,j 存放次数,遍历数组,如果当前数组a[i]等于k则j++反而j--,也就是利用抵消的思想,因为最终要找的数出现的次数大于总数的一半,所以这个数的次数j最后一定是大于0的,也就是利用这个原理可以使复杂度降到O(n)

贴下AC代码(注意不要用cin、cout)

#include<stdio.h>
const int M=10000000+5;
int a[M];
int search(int A[], int length)
{
	int k, j=0;
	for(int i=0; i<length; ++i)
	{
		if(j==0)
		{
			k=A[i];
		}
		if(k==A[i])
		{
			++j;
		}else{
			--j;
		}
	}
	return k;
}
int main()
{
	int T;
	scanf("%d",&T);
	while(T--)
	{
		int n;
		scanf("%d",&n);
		for(int i=0; i<n; ++i)
		{
			scanf("%d",&a[i]);
		}
		//找出出现次数大于一半的ID号
		printf("%d\n",search(a,n));
	}
}

时间: 2024-10-11 15:27:12

SOJ--4389: 川大贴吧水王的相关文章

SOJ4389 川大贴吧水王 队列

描述 _L的室友HZ喜欢在川大贴吧上发帖,据传说,HZ在川大贴吧上发的贴子数已经超过了该贴吧贴子总数的一半,被江湖人封为川大贴吧水王,你能帮_L迅速找出这位川大贴吧水王HZ的ID吗? 已知川大贴吧贴子总数为n,给出n个贴子作者的ID,求HZ的ID. Input 输入文件包含多组测试数据.第一行为测试的数据组数T(T<=40). 接下有T组数据,第一行输入贴子总数n(1<=n<=10000000),接下来的一行有n个正整数,分别为每位贴子作者的ID号(该ID号为不超过10^9的正整数) O

川大/电子科大校赛

第一次出校比赛 比赛时间: 电子科技大学校赛:2015.4.4 周六 四川大学校赛:2015.4.6 周一 之前本以为可以愉快地正大光明地不上课出去玩玩,不过后来才发现正值清明节,好像亏了,并不能好好滴玩耍,不过少上了4节课也是不错的,哈哈. 4.3 上午11点从学校出发,坐27路公交到圣水寺转车,然而发现时间并不多了,于是打车赶到火车站,无奈排队取票和进站的人都多得不行,看来之前小框框建议早点走是极为明智的,毕竟假期,无形甩锅....好不容易取到票出来但是进站的队伍又好长好长,只有10分钟点车

15年电科邀请赛和川大邀请赛总结

刚打完川大邀请赛回来,这次打得非常糟糕,两场爆零,虽然对心情略有影响,不过如今的我早已能轻松承受这种失败,正如周杰伦在<三年二班>里唱的,“没关系,再继续努力”.我觉得这两场比赛对我的意义不是拿个好名次让简历上好看点,虽然我之前是这么想的,但是现在我才发现,它们的真正意义在于让我知道是否走偏了路,在离区域赛还有半年时间的时候给我提个醒,或者说让我知道自己错的有多离谱,悬崖勒马. 原本我的训练计划是玩命刷专题,但是两场比赛让我体会最强烈的地方就是感觉自己所学的自己所训练的完全没用上,似乎玩的不是

浙大&amp;川大提出脉冲版ResNet:继承ResNet优势,实现当前最佳

浙大&川大提出脉冲版ResNet:继承ResNet优势,实现当前最佳 选自arXiv,作者:Yangfan Hu等,机器之心编译. 脉冲神经网络(SNN)具有生物学上的合理性,并且其计算潜能和传统神经网络相同,主要障碍在于训练难度.为解决这个问题,浙江大学和四川大学近日提出了脉冲版的深度残差网络 Spiking ResNet.为解决模型转换的问题,研究者提出了一种新机制,对连续值的激活函数进行标准化,以匹配脉冲神经网络中的脉冲激发频率,并设法减少离散化带来的误差.在多个基准数据集上的实验结果表明

川大邀请赛

4423:Necklace 一道计数问题,当时不会敲,先留着 4424:Permutations 签到题 1 /***Good Luck***/ 2 #define _CRT_SECURE_NO_WARNINGS 3 #include <iostream> 4 #include <cstdio> 5 #include <cstdlib> 6 #include <cstring> 7 #include <string> 8 #include <

soj 4389模拟

背景:周赛A题, 学习:1.开始没有注意到题目中对于帖子数大于1/2的描述,纯暴力计数,各种超! 2.后来发现按顺序扫描每一个数看是否有它在数组中的数量大于1/2,是则找到.我的代码: #include<stdio.h> #include<string.h> int str[10000000]; int main(void) { int n; scanf("%d",&n); while(n--) { int m,cout=0; scanf("%

记大一大二经历以及教训

2017  5.10   我目前就读川大本科大二,第一篇文章,纯属个人的大学生活感想.   大一青涩,现在想来可以用无知形容,没找到笃定前行的方向,然而厌恶了现在的专业--风景园林.以下吐槽.此专业在我川真的是巨水,本身国内没多少开这个专业的,2012教育部学科评估排名倒数,在一个985院校里面的专业连个普通一本都比不上,可想而知教学质量和教学环境.何况这个专业挂名工科,实则是搞艺术的,数学物理一概不学,和工科不沾边,要我觉得不喜欢设计千万不要选这种专业,身边动辄就从小开始画画,素描水彩不在话下

SOJ--Zig-Zag

Zig-Zag 在图形图像处理中常常需要将一个二维的图像矩阵转化为一维的向量.二维化一维的过程实际上就是将二维数组的元素按某种顺序构成一维数组.一种常用的序列叫"Zig-Zag"序列,它按以下顺序将二维数组转化为一维数组: 你的任务,就是写一个程序把给定的二维数组按"Zig-Zag"顺序转化为一维数组. 本题中所有的二维数组都是正方形的(即行数等于列数). 输入 输入有多组测试数据,每组测试数据的第一行为一个整数n(1<=n<=50),表示二维数组的边长

2017-01-13 写在回家之前

写在回家之前: 姐姐们 突然就想买几个手办 突然就想养点花 和哥几个吃了无数遍的黄记煌 我打乒乓球很菜 很爱我的小外甥女 川大深秋的银杏 彭国华老师给我们上的抽象代数课 2016怎么可能结束在几张照片里呢,可是又太匆忙.