201909-2

好难的题,不会。

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棵树的情况就可以了,把每棵树的属性直接定义赋值到前面。这样避免变量出错

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值