2019.1.22 自主训练日志

训练第四天,今天解决了不少之前遗留下来的问题。关于昨天数组前缀和的题超时的问题得到了解决,写成函数也不能缩时,先上代码,仔细分析。
#include
using namespace std;
int a[100001],b[100001];
int main()
{
int n,sum;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
{
sum=0;
for(int j=1;j<=i;j++)
{
sum=sum+a[j];
}
b[i]=sum;
}
cout<<n<<endl;
for(int i=1;i<=n;i++)
cout<<b[i]<<endl;
return 0;
}
算法很简单,每次将数组a从头加到截止变量,所以越加越多,n个数组元素就要加n*(n+1)/2次,算的次数太多,这应该就是所谓的时间复杂度太高(●—●)(不咋个了解,明天又有活干了)
所以,为了缩时就要减少运算次数。其实仔细思考一下,前缀和其实也是每次比之前多加一项,这就是问题的所在,只要将前一次的结果加上此项就是所要的前缀和,即求第i项的前缀和就是求第i-1项的前缀和加上a数组里的第i项,这样n项前缀和就只计算n次,复杂度降低了很多。实现代码如下
#include
using namespace std;
int a[100001],b[100001]={0};
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
cout<<endl;
}
for(int i=1;i<=n;i++)
{
b[1]=a[1];
if(i!=1)
b[i]=b[i-1]+a[i];

}
cout<<n<<endl;
for(int i=1;i<=n;i++)
cout<<b[i]<<endl;
return 0;

}
除此之外,标志变量在有些时候结合条件语句可以很好的区分不同情况,比如幸运数字一题,如果单纯使用if语句很难实现,因为在不使用数组的情况下,要想对多组数据逐一进行判断并输出一个结果很难做到,或者说以现在的知识广度做不到。而标志变量就不一样了,它可以是情况的判断脱离运算过程,最后统一到一起进行输出,方便快捷。
最重要的是今天虽然有所收获,但是做题数量和速度跟不上,按照现在的速度没办法年前实现任务目标,明天要争取加快进度。书已经看到全篇懵逼的状态,不知道还要不要坚持,明天可以再尝试一下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值