考研复试过程中第一次写,对这个题进行了空间的优化,因为复试紧张,外加还有毕设,没空写解释了,就直接上代码了。
如有疑问,请加QQ:1070597920(秒回)(备注就写“csdn”四个字母)
#include<iostream>
using namespace std;
int main()
{
int n;
cin >> n;
int drop[1000] = { 0 };
int isdrop[1000] = { 0 };
int lastcount, sum = 0;
int s; // 相当于a[i][0]
int temp; // temp在for循环里的每次输入,相当于一个a[i][j]
for (int i = 0; i < n; i++)
{
cin >> s;
for (int j = 1; j <= s; j++)
{
cin >> temp;
if (j == 1)
{
lastcount = temp;
}
else
{
if (temp <= 0) // 进行了疏果
{
drop[i] += temp;
}
if (temp > 0) // 进行了统计
{
if (lastcount + drop[i] > temp) // 证明有果子暗中掉落了
{
isdrop[i] = 1; // 证明第i课树有掉落
}
lastcount = temp; // 最后一次果子统计数更新
drop[i] = 0; // 疏果数归0
}
if (j == s && temp <= 0) // 到末尾了但没有统计(就是进行了疏果操作),那我就要减去疏果的个数
{
lastcount += drop[i];
}
}
}
sum += lastcount;
}
int howmany = 0;
for (int i = 0; i < n; i++) // 统计有多少个果树掉落
{
if (isdrop[i] == 1)
howmany++;
}
int mark = 0; // 符合要求的三元个数
for (int i = 0; i < n; i++) // 统计三元组
{
if (i == 0)
{
if (isdrop[n - 1] == 1 && isdrop[0] == 1 && isdrop[1] == 1)
mark++;
}
else if (i == n - 1)
{
if (isdrop[n - 2] == 1 && isdrop[i] == 1 && isdrop[0] == 1)
mark++;
}
else
{
if (isdrop[i - 1] == 1 && isdrop[i] == 1 && isdrop[i + 1] == 1)
mark++;
}
}
cout << sum << " " << howmany << " " << mark << endl;
return 0;
}
/*
4
4 74 -7 -12 -5
5 73 -8 -6 59 -4
5 76 -5 -10 60 -2
5 80 -6 -15 59 0
*/