#include <iostream>
using namespace std;
struct info
{
int left_num;
int cut_num;
//fall代表的是有没有出现掉落的情况
int fall;
};
int main()
{
int n,op_num,a,frist_num,all_left_num=0,D=0,E=0;
cin>>n;
info arr[n];
for(int i=0;i<n;i++)
{
arr[i].cut_num=0;
arr[i].fall=0;
arr[i].left_num=0;
}
for(int i=0;i<n;i++)
{
cin>>op_num>>frist_num;
arr[i].left_num=frist_num;
for(int j=0;j<op_num-1;j++)
{
cin>>a;
if(a<=0)
{
arr[i].cut_num-=a;
arr[i].left_num+=a;
}
else
{
arr[i].left_num=a;
}
}
if((arr[i].left_num+arr[i].cut_num)<frist_num)
{
arr[i].fall=1;
}
}
for(int i=0;i<n;i++)
{
all_left_num+=arr[i].left_num;
if(arr[i].fall==1)
{
E+=1;
}
}
for(int i=0;i<n;i++)
{
if(arr[((i-1)%n+n)%n].fall==1&&arr[i%n].fall==1&&arr[(i+1)%n].fall==1)
{
D+=1;
}
}
cout <<all_left_num<<" "<<E<<" "<<D<< endl;
return 0;
}
解题思路:
就是如何找到连着的三棵树,关键在于条件判断时的循环问题,最后一棵树需要与前面两个树一起进行判断,是否都满足落果的条件。【这里使用了取余的方法】
总结:
c++里负数的取余结果是负数,所以这里要使得结果是正数,那么需要注意一下写的方式。
ps:让a对b取余
r = (a%b+b)%b;