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;
}

做了两个剪枝优化。

经验:

可以优化尽量优化。

相关推荐
HanhahnaH14 分钟前
各数据结构操作的时间复杂度汇总
数据结构·算法
Yzzz-F25 分钟前
CF2023D
c++·算法·dp
_wxd66629 分钟前
排序-堆排序(Heap Sort)
数据结构
小小帅呀34 分钟前
学习 VLA 第6天:SWIN VIT算法原理以及复现
学习·算法
猎头南楼1 小时前
杭州算法工程师,偏大模型应用落地
算法
间歇性努力持续性发呆的野生快乐选手1 小时前
二分模板(整型,浮点型)
数据结构·c++·算法
evans在进步1 小时前
LeetCode 189 轮转数组:三次反转为什么能实现右旋?
数据结构·算法·leetcode
豆沙沙包?2 小时前
函数重载/类和对象(P14-P60)
前端·算法
lingchen19062 小时前
用MATLAB r2010b和r2016b求解微分方程组
开发语言·算法·matlab