小明種蘋果(續)
來源:CCF
標籤:
參考資料:
相似題目:
題目
小明在他的果園裏種了一些蘋果樹,這些蘋果樹排列成一個圓。爲了保證蘋果的品質,在種植過程中要進行疏果操作。爲了更及時地完成疏果操作,小明會不時地檢查每棵樹的狀態,根據需要進行疏果。檢查時,如果發現可能有蘋果從樹上掉落,小明會重新統計樹上的蘋果個數(然後根據之前的記錄就可以判斷是否有蘋果掉落了),在全部操作結束後,請幫助小明統計相關的信息。
輸入
從標準輸入讀入數據。
第1行包含一個正整數N,表示蘋果樹的棵數。
第1+i行(1<=i<=N),每行的格式爲,其中,第一個正整數mi表示本行後面的整數個數。後續的m_{i}個整數表示小明對第i棵蘋果樹的操作記錄。若(1<=j<=)爲正整數,則表示小明進行了重新統計該棵樹上的蘋果個數的操作,統計的蘋果個數爲;若爲零或負整數,則表示一次疏果操作,去掉的蘋果個數是|aij|輸入保證一定是正確的,滿足:
1、,即對於每棵樹的記錄,第一個操作一定是統計蘋果個數(初始狀態,此時不用判斷是否有蘋果掉落);
2、每次疏果操作保證操作後樹上的蘋果個數仍爲正。
輸出
輸出到標準輸出。
輸出只有一行,包含三個整數T、D、E,其中,
·T爲全部疏果操作結束後所有蘋果樹上剩下的蘋果總數(假設每棵蘋果樹在最後一次統計蘋果個數操作後蘋果不會因爲疏果以外的原因減少);
·D爲發生蘋果掉落的蘋果樹的棵數;
·E爲相鄰連續三棵樹發生蘋果掉落情況的組數。
對於第三個統計量的解釋:N棵蘋果樹排列成一個圓,那麼與相鄰,與相鄰,…與相鄰,與相鄰。如果這三棵樹都發生了蘋果掉落的情況,則記爲一組。形式化的,有
其中,表示蘋果樹A,是否發生蘋果掉落的情況,表示的前一棵樹(如果i>1)或者(如果i=1),表示的後一棵樹(如果i<N)或者(如果i=N)
輸入樣例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
樣例解釋1
全部操作結束後,第1棵樹上剩下的蘋果個數爲74-7-12-5=50,第2棵爲59-4=55,第3棵爲60-2=58,第4棵爲59-0=59,因此T=50+55+58+59 = 222。
其中,第3棵樹在第2次統計之前剩下的蘋果個數爲76-5-10=61>60,因此發生了蘋果掉落的情況。可以檢驗其他的樹沒有這種情況,因此D=1。
沒有連續三棵樹都發生蘋果掉落的情況,因此E=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
樣例解釋2
第1、2、4、5棵樹發生了蘋果掉落的情況,因此D=4,其中,連續三棵樹都發生蘋果掉落情況的有(5,1,2)和(4,5,1),因此E=2.
提示
解題思路
請直接參考代碼。
參考代碼
#include<cstdio>
const int MAXN=1002;
bool has[MAXN]; //has[i]==true,第i+1棵樹上有掉落
int N;
int T, D, E;
int main() {
int m; //操作個數
int d; //操作記錄
scanf("%d", &N);
for(int i=0; i<N; i++) {
scanf("%d", &m);
int s=0; //第i棵樹上的蘋果總數
scanf("%d", &s);
T+=s;
for(int j=1;j<m;j++){
scanf("%d", &d);
if(d<0){
s+=d;
T+=d;
}
if(d>0){
if(s>d && has[i]==false){ //有掉落,且之前未發生過掉落
has[i]=true;
D++;
}
T-=(s-d);
s=d; //重新統計該樹上的蘋果總數
}
}
}
//統計組數
for(int i=0;i<N;i++){
if(has[i] && has[(i+1)%N] && has[(i+2)%N]) E++;
}
printf("%d %d %d\n", T, D, E);
return 0;
}