伍子胥引荐专诸后,公子光为行刺之事,命专诸前往太湖,请名工铸造一柄短小锋利的宝剑,名曰"鱼肠剑"。剑成之后,需测试其分金断玉之能。
现有𝑛块精铁锭,其硬度分别为𝑎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;
}
做了两个剪枝优化。
经验:
可以优化尽量优化。