【題目概述】
小明種蘋果(續)相較於第一題難度有了一定的提升,蘋果樹排列成了一個圓,需要考慮蘋果從樹上掉落的情況以及處理蘋果的疏果操作。
【輸入輸出】
輸入要嚴格按照題目要求,注意不要輸錯。最後輸出疏果後的剩餘的蘋果總數T,發生蘋果意外掉落的樹的棵樹D,連續三個樹發生蘋果掉落情況的組數E。
【思路】
相較於第一題難度,第二題難度有了一定的提升,需要處理的難點有
1. 正確處理小明重新統計蘋果樹的情況,並判斷是否發生蘋果掉落。
這裏可以通過比較第二次之後的mi是否大於0來判斷小明是否重新統計了蘋果樹;判斷蘋果是否掉落可以與之前的疏果後的蘋果總數比較,若不一致則發生蘋果掉落。
2. 判斷連續三個樹發生蘋果掉落情況的組數。
設置flag,記錄所有蘋果樹發生蘋果的掉落情況,然後進行類似flag1^flag2^flag3==1的操作來判斷是否連續三個樹發生蘋果掉落,並記錄組數。
具體解釋請看代碼分析:
#include <iostream>
#include <vector>
using namespace std;
//定義蘋果數結構體
struct appletree
{
//記錄nums中的數據個數
int num;
//記錄蘋果樹疏果後剩餘的蘋果數
vector<int> nums;
//1表示有蘋果意外掉落的情況發生,0則表示無掉落情況發生
bool flag;
};
int main()
{
//創建蘋果樹集合
vector<appletree> appnums;
//N爲蘋果棵樹,M表示改行後面需要輸入的整數個數
int N, M;
cin >> N;
//疏果後的剩餘的蘋果總數
int appsums = 0;
//發生蘋果意外掉落的樹的棵樹
int errornum = 0;
//連續三個樹發生蘋果掉落情況的組數
int listnum = 0;
for (int i = 0; i < N; i++)
{
cin >> M;
appletree appnum;
appnum.num = 0;
appnum.flag = 0;
int mi;
for (int j = 0; j < M; j++)
{
cin >> mi;
//記錄第一次統計蘋果樹的數量
if (mi > 0 && appnum.num == 0)
{
appnum.nums.push_back(mi);
appnum.num++;
}
//判斷是否重新統計,若是則在nums後插入重新統計的數據
else if (mi > 0 && appnum.num > 0)
{
appnum.nums.push_back(mi);
//判斷是否發生掉落情況,若是則flag=1
if (mi != appnum.nums[appnum.num - 1])
{
appnum.flag = 1;
}
appnum.num++;
}
//處理疏果情況,更新疏果後的蘋果數
else
{
appnum.nums[appnum.num - 1] += mi;
}
}
//記錄發生蘋果意外掉落的樹的棵樹
if (appnum.flag == 1)
errornum++;
//所有蘋果樹疏果後的蘋果總數
appsums += appnum.nums[appnum.num - 1];
appnums.push_back(appnum);//將數據添加到蘋果樹集合中
}
//處理連續三個樹發生蘋果掉落的情況
for (int i = 0; i < N; i++)
{
//當發現flag=1時表示有蘋果意外從樹上掉落
if (appnums[i].flag == 1)
{
//判斷該樹的前後是否flag都等於1,若是則listnum++
if (appnums[(i + 1 + N) % N].flag == 1 && appnums[(i - 1 + N) % N].flag == 1)
{
listnum++;
}
}
}
cout << appsums << " " << errornum << " " << listnum << endl;
return 0;
}
測試數據集:
測試數據集
輸入1:
4
4 74 -7 -12 -5
5 73 -8 -6 59 -4
5 76 -5 -10 60 -2
5 80 -6 -15 59 0
輸出1:
222 1 0
輸入2:
5
4 10 0 9 0
4 10 -2 7 0
2 10 0
4 10 -3 5 0
4 10 -1 8 0
輸出2:
39 4 2