Typesetting math: 100%

[洛谷P2397]yyy loves Maths VI (mode)

题目传送门#

这道题题面十分简单,貌似不难,但空间一限制就比较麻烦了。

其实了解了一些比较重要的东西就很简单了。

先不切入重点。

方法一#

如果一个数过半,如果将这个数转成二进制的形式,则该数对应的每位上的数(不是0就是1)一定过半(指其他数的对应数位01的统计)。

举个例子:有一串数列{2,2,3,2,1,2}。把每个数换成二进制即为:

101011100110

发现第一位1出现比0次数多,第二位01多。所以过半的数的二进制为10、即为2

这个方法比较冷门,好像并无卵用常数较大但能过(过了读入毒瘤即可)。

方法二#

步入正解:摩尔投票法

步骤:

(1)两个变量:now_numcount

(2)读入数val

(3)如果val不等于now_num,让count自减。如果本来count0,标记now_numval并让count为1;

(4)否则count自加;

(5)重复步骤(2)。

正确性:会发现对于每一个val都会抵消掉一个不等于它的val,而所求的数过半,所以这个数会抵消掉其他所有数且还有过剩的。

注意这个性质具有可加性。也就是可以用线段树等数据结构维护。

假如求过了三分之一的数呢?有摩尔投票法的扩展。

然而我太弱了不知道其实就是搞两个now_numcount弄一下。

最后这道题要注意读入快读啥的都挂了,必须要scanf才不被卡原理玄学。

复制代码
 1 int n, v, x, cnt = 0;
 2 
 3 int main() {
 4     scanf("%d", &n);
 5     rep(i, 1, n) {
 6         scanf("%d", &x);
 7         if (cnt == 0) v = x;
 8         cnt += v == x ? 1 : -1;        
 9     }
10     printf("%d", v);
11     return 0;
12 }
复制代码

 

posted @   AC-Evil  阅读(167)  评论(0编辑  收藏  举报
编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库
点击右上角即可分享
微信分享提示
CONTENTS