思路:本题与第一题的解法相似,还是模拟,不涉及算法问题;在计算连续三组落果的时候容易出现重复计算,例如:
假设有n棵果树,其落果序列 :11011 因为是循环序列,考虑所有组合可知新的序列为:1101111 最多在末尾添加2位,否则会出现重复计算的情况;
如果序列末尾为没有落果的情况,例如:10110,则循环序列还是本身,因为末尾部分将无法与首位的部分组成连续的三组;
代码如下(代码写的臃肿,勿喷!哈哈)
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll apple_num[1005];
string s;
int main()
{
std::ios::sync_with_stdio(false);
ll n,D = 0,E = 0,num,sum_apple = 0,flag=0;
cin>>n;
while(n--){
cin >> num;
int rest_apple = 0;
int d = 0;
memset(apple_num,0,sizeof(apple_num));
for(int i = 0;i < num; i++){
cin>>apple_num[i];
if(i == 0){
rest_apple = apple_num[0];
}
else{
if(apple_num[i] <= 0){
rest_apple += apple_num[i];
}
else
if(apple_num[i] < rest_apple){
d++;
rest_apple = apple_num[i];
}
}
}
sum_apple = sum_apple + rest_apple;//剩余果子数目
if(d > 0){
D++;
s=s+'1';
}
else{
s=s+'0';
}
flag++;
}
if(s[flag-1]!='0' && s[0]!='0'){ //末尾不为零的情况
string a =s;
for(int k=0;k<=1;k++){
if(s[k]=='1'){
a=a+s[k];
}
}
int len = a.length();
for(int i = 0; i <len; i++){
ll cnt=0;
for(int j=i;j<=i+2;j++){
if(a[j]=='1'){
cnt++;
}
}
if(cnt==3){
E++;
}
}
}
else{ //末尾为零的情况
for(int i = 0; i <flag; i++){
ll cnt=0;
for(int j=i;j<=i+2;j++){
if(s[j]=='1'){
cnt++;
}
}
if(cnt==3){
E++;
}
}
}
cout << sum_apple << " " << D << " " << E <<endl;
return 0;
}
闲鱼算法书PDF版,有需要的同学可以看看: