[洛谷P2397]yyy loves Maths VI (mode)
题目传送门#
这道题题面十分简单,貌似不难,但空间一限制就比较麻烦了。
其实了解了一些比较重要的东西就很简单了。
先不切入重点。
方法一#
如果一个数过半,如果将这个数转成二进制的形式,则该数对应的每位上的数(不是就是)一定过半(指其他数的对应数位或的统计)。
举个例子:有一串数列。把每个数换成二进制即为:
、、、、、。
发现第一位出现比次数多,第二位比多。所以过半的数的二进制为、即为。
这个方法比较冷门,好像并无卵用常数较大但能过(过了读入毒瘤即可)。
方法二#
步入正解:摩尔投票法。
步骤:
(1)两个变量:、;
(2)读入数;
(3)如果不等于,让自减。如果本来为,标记为并让为1;
(4)否则自加;
(5)重复步骤(2)。
正确性:会发现对于每一个都会抵消掉一个不等于它的,而所求的数过半,所以这个数会抵消掉其他所有数且还有过剩的。
注意这个性质具有可加性。也就是可以用线段树等数据结构维护。
假如求过了三分之一的数呢?有摩尔投票法的扩展。
然而我太弱了不知道其实就是搞两个和弄一下。
最后这道题要注意读入快读啥的都挂了,必须要才不被卡原理玄学。
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 }
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
· 手把手教你更优雅的享受 DeepSeek
· 腾讯元宝接入 DeepSeek R1 模型,支持深度思考 + 联网搜索,好用不卡机!
· AI工具推荐:领先的开源 AI 代码助手——Continue
· 探秘Transformer系列之(2)---总体架构
· V-Control:一个基于 .NET MAUI 的开箱即用的UI组件库