T201909-2 : http://118.190.20.162/view.page?gpid=T93
测试样例
5
4 10 0 9 0
4 10 -2 7 0
2 10 0
4 10 -3 5 0
4 10 -1 8 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
思路
73 -8 -6 59 -4,然后选定第一个73,往后遇到非正数,就加,73-8-6=59
遇到正数59,就替换成59,如果替换前的数值大于替换后,就 es == 1 表示掉落过
同时计算每棵树的 sum
最后再统计False出现的相邻情况即可
代码
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt(); // n 棵树
int [][] apples = new int[n+1][1000 + 7];
long [] sum = new long[n]; // 记录当前这个树的个数
long sum1 = 0; // 记录所有树的剩余总数
long d = 0; // 掉落过的棵树
int [] es = new int[n+2]; // 标记是否掉落过
for (int i = 0; i < n; i++) {
int m = in.nextInt();
boolean f = true; // 防止同一颗树多次掉落
for (int j = 0; j < m; j++) {
apples[i][j] = in.nextInt();
if(apples[i][j] <= 0) {
sum[i] += apples[i][j];
}else {
if(j > 0 && sum[i] > apples[i][j] && f) {
d++;
es[i+1] = 1;
f = false; // 当前这棵树只标记一次就行了
}
// 每棵树的剩余总数
sum[i] = apples[i][j];
}
}
}
for (int i = 0; i < n; i++) {
sum1 += sum[i]; // 所有树剩下的总数
}
/**
* 计算 相邻 3 个的数量
*/
long sum2 = 0;
for(int i = 1; i <= n; i++)
{
if(es[i] == 1)
{
if(i==1 && es[n] == 1&& es[i+1] == 1)
sum2++;
else if(i==n && es[i-1] == 1 && es[1] == 1)
sum2++;
else if(es[i-1] == 1 && es[i+1] == 1)
sum2++;
}
}
System.out.print(sum1 + " " + d + " " + sum2);
}
}
三个相邻的个数的计算