牛客Wannafly挑战赛27 A 灰魔法师

本文解析了一种寻找数组中完全平方数对的算法。通过预处理生成完全平方数列表,利用数组记录输入序列,遍历查找满足条件的数对,解决组合计数问题。特别讨论了重复元素的处理方式。

感谢大佬%%%
↑↑↑↑↑↑↑↑↑↑
讲解非常仔细

做题的时候也有想过去打表,然后就没有了,
还是没有找到其中的规律。。。。
这里补一条完全平方数的定义?
这个数开根号后是整数 如:9,25,36…

思路:

因为题目数据是1e5,所以两个数相加也只有2e5,从1到2e5满足条件的完全平方数个数也只有400+,就用一个数组去记录下来,然后for循环把给出的序列先标记一遍,再从已知的完全平方数里挨个for一遍找到:
完全平方数 减去 a[i]得到一个数,这个数是否存在所给序列中
存在的话就会出现两种情况:

  1. 如2 2 2这种情况就有三种方案 其实就是组合数的公式,
    (n个数里选两个):n×(n-1)/2;
  2. 如1 1 3 3这里就会重复计算,因为起初是从1开始去找3,在3的时候又去找1,所以ans/=2;

大概就是这样了
代码是dalao那搬运的

#include <bits/stdc++.h>
#define ll long long
using namespace std;
ll vis[100010],n,a[1010],pos,ans1,ans2;
ll ans;
int main()
{
    pos=1;
    for(ll i=1;i*i<=200000;i++)a[pos++]=i*i;   //生成平方数
    while(~scanf("%lld",&n))
    {
        memset(vis,0,sizeof(vis));
        ll x;
        for(ll i=1;i<=n;i++)
        {
            scanf("%lld",&x);
            vis[x]++;   //统计个数
        }
        ans1=ans2=0;
        ll tmp;
        for(ll i=1;i<pos;i++)   //平方数数组
        {
            for(ll j=1;j<=100000;j++)   //1e5以内所有数
            {
                if(vis[j]==0)continue;  
                tmp=a[i]-j;
                if(tmp>100000)continue;   //不合法范围
                if(tmp<=0)break;   //不合法
                if(vis[tmp])
                {
                    if(tmp==j)ans1+=(vis[j]*(vis[j]-1))/2;   //相同时用组合公式
                    else ans2+=vis[tmp]*vis[j];   //不同时直接乘
                }
            }
        }
        ans1=ans1+ans2/2;
        printf("%lld\n",ans1);
    }
    return 0;
}
根据用户提供的关键词“小A 弹吉他 牛客牛客网 小白月赛 108 比赛详情 参赛攻略”,以下是整合后的相关信息和建议: --- ### 关于小白月赛108的比赛详情 小白月赛是由牛客网主办的一系列面向编程爱好者的在线竞赛之一。第108场赛事通常会围绕算法、数据结构以及实际问题解决能力展开挑战。比赛题目可能涉及但不限于字符串处理、动态规划、图论等领域。 对于与“小A弹吉他”相关的具体题目,可能是某道以音乐或乐器为主题的趣味性算法题。这类题目往往需要结合数学建模能力和逻辑推理技巧来完成解答。 --- ### 如何准备此类比赛? #### 方法一:熟悉常见算法模板 确保掌握基础的数据结构(如栈、队列)及经典算法模型(例如深度优先搜索DFS、广度优先搜索BFS)。针对可能出现的音符序列匹配或者节奏计算等问题提前复习KMP模式匹配法等相关知识点。 #### 方法二:模拟真实考场环境练习 利用过往的小白月赛记录进行刷题训练,在规定时间内尝试独立解决问题从而提升临场发挥水平。同时注意控制提交频率避免因超时错误而扣分过多。 #### 方法三:学习优秀选手思路分享 访问牛客社区查看往届高排名玩家的经验贴。他们可能会提到如何快速理解复杂描述型试题的方法论;也可能提供一些特别好用但容易被忽略掉的小技巧比如调试输出设置等细节优化方案。 --- ### 示例代码片段供参考(假设存在一个简单版本的问题) 如果遇到类似判断两个旋律是否相同类型的程序设计,则可以考虑如下实现方式: ```python def is_same_melody(melody_a, melody_b): return melody_a == melody_b melody_A = list(map(int, input().split())) melody_B = list(map(int, input().split())) if len(melody_A) != len(melody_B): print("No") else: if is_same_melody(melody_A,melody_B): print("Yes") else: print("No") ``` 此段落仅为示意用途,请依据实际情况调整适应不同难度等级下的业务场景需求。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值