上海月赛2025年2月- 新二进制

新二进制

出题人的脑子真好,这都能想到,先点个赞!

不熟悉进制转换的同学们都知道,根据进位原则,第i位代表值,[1,i-1]范围加起来也不可能比它大,参考玄幻小说设定,比如9999个九星斗尊也不可能打过一星斗圣。因为只要发生进位,就代表质的飞跃。

因此,第 i 位 数字,能决定 i 个 符号相同的区间,看下面。

位数 1 2 3 4
1 1 -1 1

当位数为 4时, 所有包含4 的区间为正,第4位的权值比1-3位加起来都要大,

[4,4]、[3,4]、[2,4],[1,4]. 的区间由第四位的值正负决定。

解题思路

  1. 核心观察:

    • 每个数字只能是1或-1

    • 位置越靠后,权重越大

    • 需要统计不同符号区间的数量

  2. 计数策略:

    • 正数区间:以1结尾的区间

    • 负数区间:以-1结尾的区间

    • 最终答案 = |正区间数 - 负区间数|

  3. 代码实现关键:

    for(int i=1; i<=n; i++){  
        scanf("%d",&x);  
        if(x==1) ca+=i;   // 正区间计数  
        else cb+=i;       // 负区间计数  
    }  

解题细节

  • 使用long long防止整数溢出

  • 注意使用%lld输出long long类型(我第一编提交是被这里坑了)

思考题

  1. 如果改变权重计算方式,结果会有何不同?

  2. 这个算法的本质是什么?(评论区大神讨论一波哇)

你可能感兴趣的:(上海市计算机学会月赛,算法,c++,学习,上海月赛)