MC0550鱼肠剑试锋芒

伍子胥引荐专诸后,公子光为行刺之事,命专诸前往太湖,请名工铸造一柄短小锋利的宝剑,名曰"鱼肠剑"。剑成之后,需测试其分金断玉之能。

现有𝑛块精铁锭,其硬度分别为𝑎1∼𝑎𝑛。专诸需依次进行𝑞次试剑,每次试剑指定一个整数𝑥,表示鱼肠剑的斩切力度。每块铁锭的硬度𝑎𝑖将变为⌊𝑎𝑖/𝑥⌋,即其硬度被剑力整除后的整数部分。

请你帮助专诸计算,在每次试剑操作结束后,所有铁锭的硬度之和∑𝑖=1𝑛 𝑎𝑖为多少?

输入格式:

第一行两个整数𝑛,𝑞(1≤𝑛≤10^6,1≤𝑞≤10^6),整数之间用一个空格隔开。

第二行𝑛个整数𝑎1∼𝑎𝑛(1≤𝑎𝑖≤2000),整数之间用一个空格隔开。接下来𝑞行,每行一个整数𝑥(1≤𝑥≤10),表示一次操作。

输出格式:

输出

𝑞行,表示每次操作结束后的答案。

样例 1

输入:

5 3

6 6 7 9 10

2

1

2

输出:

18

18

7

超时代码

cpp 复制代码
#include<bits/stdc++.h> 

using namespace std;

int main( )
{
    int n,q;
    cin>>n>>q;
    int a[n];
    for(int i=0;i<n;i++){
        cin>>a[i];
    }
    while(q--){
        int x;
        cin>>x;
        int sum=0;
        for(int i=0;i<n;i++){
            a[i]=floor(a[i]/x);
            sum+=a[i];
        }
        cout<<sum<<"\n";
    }
    return 0;
}

正确代码:

cpp 复制代码
#include<bits/stdc++.h> 

using namespace std;

int main( )
{
    int n,q;
    cin>>n>>q;
    int a[n];
    int sum=0;
    for(int i=0;i<n;i++){
        cin>>a[i];
        sum+=a[i];
    }
    while(q--){
        int x;
        cin>>x;
        if(x==1||sum==0){
            cout<<sum<<"\n";
            continue;
        }
       sum=0;
        for(int i=0;i<n;i++){
            a[i]=floor(a[i]/x);
            sum+=a[i];
        }
        cout<<sum<<"\n";
    }
    return 0;
}

做了两个剪枝优化。

经验:

可以优化尽量优化。

相关推荐
仍然.2 小时前
算法题目---链表
数据结构·算法·链表
luoganttcc2 小时前
华为昇腾(Ascend)等芯片,同样存在“寄存器 / 片上存储资源限制并发”的问题
算法·华为
小O的算法实验室2 小时前
2025年SEVC,神经-粒子群算法+大规模动态优化,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
wayz112 小时前
Day 7:第一周复习与模型综合比较
人工智能·算法·机器学习·量化交易
玛丽莲茼蒿2 小时前
Leetcode hot100 买卖股票的最佳时机【简单】
算法·leetcode·职场和发展
阿Y加油吧2 小时前
两道 LeetCode 题的复盘笔记:从「只会暴力」到「懂优化」
笔记·算法·leetcode
We་ct2 小时前
LeetCode 300. 最长递增子序列:两种解法从入门到优化
开发语言·前端·javascript·算法·leetcode·typescript
wayz113 小时前
Day 9 :随机森林调参与时间序列交叉验证
算法·随机森林·机器学习
️是783 小时前
信息奥赛一本通—编程启蒙(3371:【例64.2】 生日相同)
开发语言·c++·算法