题目描述
小明在他的果园里种了一些苹果树,这些苹果树排列成一个圆。为了保证苹果的品质,在种植过程中要进行疏果操作。为了更及时地完成疏果操作,小明会不时地检查每棵树的状态,根据需要进行疏果。检查时,如果发现可能有苹果从树上掉落,小明会重新统计树上的苹果个数(然后根据之前的记录就可以判断是否有苹果掉落了)。在全部操作结束后,请帮助小明统计相关的信息。
思路
对每棵果树的信息进行判断是否有苹果掉落,然后最后进行统计。
判断过程如下:
第一个输入,是果树最开始的苹果数量
然后判断输入的正负
负数,表示摘掉的苹果数量
正数,表示重新进行了统计
用(最开始的苹果数量-摘掉的总苹果数量)和当前的苹果数量进行比较,如果不相等,表示有苹果掉落,记录掉落的苹果数量
果树上最后的数量为,初始数量-摘掉数-掉落数
当然还有不同的算法,这种仅供参考
具体代码
#include <iostream>
using namespace std;
long int a[1001][1005];//记录每个果树的操作
long int b[1001];
long int dis[1001];//记录该果树摘掉的苹果数量
long int yi[1001];//记录掉落的苹果数量
bool test[1001];//记录果树是否有苹果掉落
bool test2[1001];
int main() {
int N;
cin>>N;
int M;
int D;
D=0;
int i,k;
for(i=0;i<N;i++)//初始化
{
dis[i]=0;
test[i]=false;
test2[i]=false;
yi[i]=0;
}
for(i=0;i<N;i++)//对每棵果树进行输入和判断
{
cin>>M;
cin>>a[i][0];//一开始果树上的苹果数量
for(k=1;k<M;k++)
{
cin>>a[i][k];
if(a[i][k]<0)//摘落
dis[i]-=a[i][k];
else if(a[i][k]>0)
{
b[i]=a[i][k];
if((a[i][0]-dis[i]-yi[i])!=b[i])
{
if(!test[i])//
D++;
test[i]=true;
yi[i]+=(a[i][0]-dis[i]-yi[i]-b[i]);
}
}
}
}
long long int sum;
int E;
for(i=0,sum=0;i<N;i++)
{
sum+=(a[i][0]-dis[i]-yi[i]);
}
E=0;
for(i=1;i<N-1;i++)
{
if(test[i]&&test[i-1]&&test[i+1])
E++;
}
if(test[0]&&test[N-1]&&test[1])
E++;
if(test[N-1]&&test[N-2]&&test[0])
E++;
cout<<sum<<' '<<D<<' '<<E;
return 0;
}