问题描述
问题分析
题目不难理解,求T(苹果的总数)和E(有苹果掉落的树的个数)也没什么难度,遍历数组进行判断就可以实现,这里略过(后面完整代码注释里会有)。
主要要解决的问题在于如何统计E(连续三棵树都有苹果掉落的个数)。首先题中是将所有果树种成一个圆的,而我们在存储题中所给的信息时一般是用数组的形式,所以在统计E的个数时,我们需要考虑数组头尾相接的情况。
这里我用一个int数组flag[N]来标记每一棵树是否有苹果掉落的情况,有掉落则为1;没有则为0。
然后我们只需要找出值连续为1的区间,统计其中连续三个一组的组数,最后在考虑一下首尾相接的情况就可以了。
以上图情况为例,0~4都为1,以连续三个为一组的话分组就有3组,故而对于每一段连续count个1的区间,我们不难得出三个一组的数量为
(
c
o
u
n
t
−
3
)
+
1
(count-3)+1
(count−3)+1。
对于首尾相接的情况,只有两种可能是连续三个为1,即flag[N-2]、flag[N-1]、flag[0] 和 flag[N-1]、flag[0]、flag[1],直接用两个if语句判断一下。
int D=0, E=0; //D为有果子掉落的树的个数,E为相邻三个一组都有掉落的组数
int count = 0;
for(int i=0; i<N; i++) {
if(flag[i]==1) {
D++;
count++;
}else { //遇到flag等于0时,根据当前连续flag==1的个数,计算出相邻三个一组的个数
if(count>=3) {
E += 1+(count-3);
}
count = 0;
}
}
if(count>=3) E += 1+(count-3); //遍历结束时若count不为0,计算相邻三个一组的个数
//考虑头尾相接的情况:
if((flag[N-2]==1) && (flag[N-1]==1) && (flag[0]==1)) E++;
if((flag[N-1]==1) && (flag[0]==1) && (flag[1]==1)) E++;
满分代码
由于对每棵树的操作次数不一定相同,所以我用STL中的vector容器来存储所有的操作记录,定义一个vector类型的数组,每一棵树对应数组中一个vector。(由于操作记录绝对值最大可达
1
0
6
10^6
106,所以要开long long防止错误)
#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
vector<long long> oper[1001];
int main() {
int N, m;
cin >> N;
for(int i=0; i<N; i++) {
cin >> m;
long long temp;
for(int j=0; j<m; j++) {
cin >> temp;
oper[i].push_back(temp);
}
}
long long result[N]; //最终每棵树上的果子个数
long long T = 0; //最后所有果子的总数
int flag[N] = {0}; //标记每棵树是否有果子掉落
for(int i=0; i<N; i++) {
vector<long long>::iterator it = oper[i].begin();
result[i] = *it;
it++;
while(it!=oper[i].end()) {
long long temp = *it;
//操作数为负数,表示进行了疏果
if(temp<=0) {
result[i] += temp;
}
else { //没有进行疏果,则要判断是否有果子掉落
if(temp<result[i]) {
flag[i]=1;
}
result[i] = temp;
}
it++;
}
T += result[i];
}
int D=0, E=0; //D为有果子掉落的树的个数,E为相邻三个一组都有掉落的组数
int count = 0;
for(int i=0; i<N; i++) {
if(flag[i]==1) {
D++;
count++;
}else { //遇到flag等于0时,根据当前连续flag==1的个数,计算出相邻三个一组的个数
if(count>=3) {
E += 1+(count-3);
}
count = 0;
}
}
if(count>=3) E += 1+(count-3); //遍历结束时若count不为0,计算相邻三个一组的个数
//考虑头尾相接的情况:
if((flag[N-2]==1) && (flag[N-1]==1) && (flag[0]==1)) E++;
if((flag[N-1]==1) && (flag[0]==1) && (flag[1]==1)) E++;
cout << T << " " << D << " " <<E;
return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)