问题链接:CCF201909-2 小明种苹果(续)
提交结果:(在超时的边缘……)
注意:若第44-45行条件为badtreeorder[i-2] == badtreeorder[i-1]
&& badtreeorder[i-1] == badtreeorder[i],若为若条件设为badtreeorder[i] == badtreeorder[i+1]&& badtreeorder[i+1] == badtreeorder[i+2] 将出错。
java代码:
import java.util.Scanner;
/**
* Main.注意考虑到边界情况与特殊情况
* @author : cxc
**/
public class Main {
//超时如何处理?循环展开,减少分支语句
public static void main(String[] args) {
Scanner myin = new Scanner(System.in,"utf-8");
int N = myin.nextInt();
int sum = 0;//剩下所有果子
//中间变量
int[] expectnum = new int[N];
int[] realnum = new int[N];
int badtreenum = 0;//掉落苹果树的数量
int threetreenum = 0;//连续三棵树掉落的组数
int[] badtreeorder = new int[N];
for(int i = 0;i < N;i++){
int M = myin.nextInt();//操作的数目
int treesum = myin.nextInt();//该树的果子数
expectnum[i] = treesum;
realnum[i] = treesum;
int flag = 0;//标志是否掉落(1是,0不是)
for(int j = 1;j < M;j++) {
int temp = myin.nextInt();//第一个操作一定是统计苹果个数
if (temp < 0) {
expectnum[i] += temp;
treesum += temp;
}
else if (temp > 0) {
realnum[i] = temp;//调整当前苹果数目
treesum = temp;
if (flag == 0 && realnum[i] < expectnum[i]) {
flag = 1;
}
}
}
sum += treesum;//总计每棵树果子数
if(flag == 1){
badtreeorder[i] = 1;//掉落苹果树
if(i>1 && badtreeorder[i-2] == badtreeorder[i-1]
&& badtreeorder[i-1] == badtreeorder[i]){
//注意赋值顺序,累积赋值,应该与前面的比较
threetreenum++;
}
badtreenum++;
}
}
if(badtreeorder[N-2] == badtreeorder[N-1]
&& badtreeorder[N-1] == badtreeorder[0]
&& badtreeorder[0] == 1){
threetreenum++;
}
if(badtreeorder[N-1] == badtreeorder[0]
&& badtreeorder[0] == badtreeorder[1]
&& badtreeorder[0] == 1){
threetreenum++;
}
System.out.printf("%d %d %d%n",sum, badtreenum ,threetreenum);
}
}
来源:CSDN
作者:一个路过的小码农110
链接:https://blog.csdn.net/JAck_chen0309/article/details/103484640