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語句很難實現,因爲在不使用數組的情況下,要想對多組數據逐一進行判斷並輸出一個結果很難做到,或者說以現在的知識廣度做不到。而標誌變量就不一樣了,它可以是情況的判斷脫離運算過程,最後統一到一起進行輸出,方便快捷。
最重要的是今天雖然有所收穫,但是做題數量和速度跟不上,按照現在的速度沒辦法年前實現任務目標,明天要爭取加快進度。書已經看到全篇懵逼的狀態,不知道還要不要堅持,明天可以再嘗試一下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章