好难的题,不会。
400ms
#include<iostream>
#include<cstring>
using namespace std;
int main(){
int N,m,T=0,D=0,E=0,U[1001];
memset(U,0,sizeof(U));
cin>>N;
for(int i=0,a,b;i<N;++i){
cin>>m;
if(m>0){
cin>>a;
for(int j=1;j<m;++j){
cin>>b;
if(b<1) //如果人工去果,就
a+=b;
else if(a!=b)
U[i]=1,a=b;
}
if(U[i]==1) ++D;
T+=a;
}
}
if(N>2){
for(int i=0;i<N;++i) if(U[(i-1+N)%N]==1&&U[i]==1&&U[(i+1)%N]==1) ++E;
}
cout<<T<<" "<<D<<" "<<E<<endl;
return 0;
}
** 思路:上述代码最关键的就是判断部分。这道题启发是:能不用数组就不用数组。这道题必须使用数组的地方是判断是否有连续三棵树掉果子,其他的不用。
注意:这道题使用的变量很多,注意初始化和作用域。 **
另一种做法
#include<iostream>
using namespace std;
int drop[1001];
int n,total=0,sum=0,cnt=0;
int f(const int &a){
return a<=n?a:(a-n);
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int m,num,a;
scanf("%d%d",&m,&num);
for(int j=1;j<m;j++){
scanf("%d",&a);
if(a<=0) num+=a;
else if(num!=a){
drop[i]=1;
num=a;
}
}
total+=num;
}
for(int i=1;i<=n;i++){
sum+=drop[i];
if(drop[i]&&drop[f(i+1)]&&drop[f(i+2)]) cnt++;
}
printf("%d %d %d",total,sum,cnt);
return 0;
}
超时了。。。
#include<iostream>
#include<cstring>
using namespace std;
int main() {
int n;
cin>>n;
int ans1=0,ans2=0,ans3=0;
int u[1001];
memset(u,0,sizeof(u));
for(int i=0;i<n;i++) {
int m,num;
cin>>m>>num;
for(int j=0,cao;j<m;j++) { //超时的原因
cin>>cao;
if(cao<=0) num+=cao;
else if(cao!=num) { num=cao; u[i]=1;}
}
ans1+=num;
if(u[i]==1) ans2++;
}
for(int i=0;i<n-2;i++) if(u[i]==1&&u[i+1]==1&&u[i+2]==1) ans3++;
if(u[n-1]==1&&u[0]==1&&u[1]==1) ans3++;
cout<<ans1<<" "<<ans2<<" "<<ans3;
return 0;
}
80分
#include<iostream>
using namespace std;
int main() {
int ans1=0,ans2=0,ans3=0,n,m;
int u[1005]={0};
cin>>n;
for(int i=1;i<=n;i++) {
int sum,a;
cin>>m>>sum;
for(int j=1;j<m;j++) {
cin>>a;
if(a<1) sum+=a;
else { if(a!=sum) { u[i]=1; sum=a;} }
}
ans1+=sum;
if(u[i]==1) ans2++;
}
if(u[n]==1&&u[n-1]==1&&u[1]==1) ans3++;
for(int i=1;i<n-1;i++) if(u[i]==1&&u[i+1]==1&&u[i+2]==1) ans3++;
cout<<ans1<<" "<<ans2<<" "<<ans3;
return 0;
}
八十分的原因:忽略了u[n],u[1],u[2];
重新做,作对了
#include<iostream>
using namespace std;
int main() {
int n;
cin>>n;
int lost[1005]={0};
int ans1=0,ans2=0,ans3=0;
for(int i=1;i<=n;i++) {
int m,count;
cin>>m>>count;
for(int j=1,a;j<m;j++) {
cin>>a;
if(a<=0) {
count+=a;
}
else {
if(count!=a) {
count=a;
lost[i]=1;
}
}
}
ans1+=count;
if(lost[i]==1) ans2++;
}
for(int i=1;i<=n-2;i++) {
if(lost[i]==1&&lost[i+1]==1&&lost[i+2]==1)
ans3++;
}
if(lost[1]==1&&lost[n]==1&&lost[n-1]==1) ans3++;
if(lost[2]==1&&lost[n]==1&&lost[1]==1) ans3++;
cout<<ans1<<" "<<ans2<<" "<<ans3;
return 0;
}
现在想想,这道题其实很简单,你只需要考虑第i棵树的情况就可以了,把每棵树的属性直接定义赋值到前面。这样避免变量出错