小明種蘋果(續(xù))
- 切忌在一個(gè)循環(huán)中干多件事情
- csp不需要什么高超的算法雄家,只要不是python一切好說
題目如下
原本寫法
1獲取輸入
1.1獲取輸入同時(shí)計(jì)算最終果數(shù)
1.2獲取輸入同時(shí)計(jì)算落果數(shù)進(jìn)行落果標(biāo)記
2計(jì)算連續(xù)3顆樹的落果組數(shù)
如圖1所示
改進(jìn)寫法
1獲取輸入
1.1獲取輸入同時(shí)計(jì)算最終果數(shù)
1.2獲取輸入同時(shí)只進(jìn)行落果標(biāo)記
2計(jì)算連續(xù)3顆樹的落果組數(shù)
2.1計(jì)算組數(shù)同時(shí)計(jì)算落果標(biāo)記
區(qū)別在于:將落果數(shù)的計(jì)算移到了下方計(jì)算五垮!
個(gè)人心得:
應(yīng)當(dāng)是一個(gè)極簡單的問題,但是卻搞了一下午蹦骑,也是通過比照滿分算法得出的結(jié)論晴玖,算作是一次教訓(xùn)吧冕杠。
另外網(wǎng)上關(guān)于算法比賽的代碼很難看清楚,其一是沒有注釋洼哎,其二是命名太不規(guī)范烫映,所以根據(jù)一個(gè)程序員的良心或者從業(yè)責(zé)任心也應(yīng)當(dāng)寫的清楚明了。
最后附上完整代碼:
int treeNum = 0;
cin >> treeNum;
//最終留下的果數(shù)
int leftTotalNum = 0;
//落果數(shù)
int dropNum = 0;
//3樹落果組數(shù)
int groupNum = 0;
//根據(jù)最大果樹數(shù)簡歷的標(biāo)記落果情況的數(shù)組
int dropArray[1000] = {0};
//接收輸入
for (int i = 0; i < treeNum; i++)
{
dropArray[i] = 0;
//本行參數(shù)數(shù)
int num = 0;
cin >> num;
//參數(shù)1:蘋果起始個(gè)數(shù)
int thisBegin = 0;
cin >> thisBegin;
//標(biāo)記蘋果先前的剩余量
int previous = thisBegin;
for (int j = 1; j < num; j++)
{
//新的輸入量
int newNum = 0;
cin >> newNum;
//大于零表示計(jì)數(shù)
if (newNum>0) {
//小于先前果數(shù)表示落果
if (newNum < previous) {
//防止樹重復(fù)落果被重復(fù)計(jì)算
dropArray[i] = 1;
previous = newNum;
}
}
//小于零表示梳果
else {
previous += newNum;
}
}
//一行輸入處理完畢將剩余果量歸并
leftTotalNum += previous;
}
//利用標(biāo)記連續(xù)落果棵數(shù)計(jì)算組數(shù)
int flag = 0;
//果樹指針
int cursor = 0;
//treeNum+2表示果樹是環(huán)狀噩峦,有邊界條件
for (int i = 0; i < treeNum+2; i++)
{
if (dropArray[cursor] == 1) {
flag++;
//在此處進(jìn)行落果情況計(jì)算
if (i<treeNum) {
dropNum++;
}
}
//當(dāng)未有落果锭沟,表示需重新計(jì)算連續(xù)落果
else {
flag = 0;
}
//3棵樹落果,符合條件
if (flag >=3) {
groupNum++;
}
cursor++;
//邊界條件的處理识补,需要指針從尾部連接至首部
cursor %= treeNum;
}
cout << leftTotalNum << " " << dropNum << " " << groupNum;