这个题目的思路很简单,理解题意以后很大一部分同学应该几分钟就搞定了,但是我真的太粗心了,题目当中明显有一个“no more than once jump ”没有看到,导致我认为可以进行多次跳转,在提交的测试2上面的部分数据出现错误
这种情况导致只要测试样例中"0"之间如果出现多个"1",就会导致与正确答案相比下的硬币数量减少
例如这个样例:
按照题意的话答案为“6-1=5”,按照多次跳转的话为“(3-1)+(6-4)=4”
理解错题意的代码:
#include<bits/stdc++.h> using namespace std; int main() { int t;//测试样例 cin>>t; int n; while(t--) { cin>>n; int a[n+1]; for(int i=1;i<=n;i++) cin>>a[i]; int coin=0; int k=1;//保留上一次所在的土地位置 int flag=0;//用于判断是否需要使用硬币 //可以分段求解,每一次跳跃为一次计算过程 for(int j=2;j<=n;j++) { if(a[j]==0&&a[j-1]==1) { k=j-1; flag=1; } else if(a[j]==1&&flag==1) { flag=0; coin+=(j-k); } } cout<<coin<<endl; } }
在发现自己理解错题意后,其实很好进行改正,我们只要找到在第一个水潭的前一个位置的土地序号和最后一个水潭的后一个位置的土地序号,两者相减即可(若只有一个水潭也是一样的计算方法)
正确题解
#include<bits/stdc++.h> using namespace std; int main() { int t;//测试样例 cin>>t; int n; while(t--) { cin>>n; int a[101]={0}; for(int i=1;i<=n;i++) cin>>a[i]; int coin=0; int p=1; int q=n;//用来定位出现第一个水潭的前一个位置和最后一个水潭的后一个位置 while(a[p+1]==1) p++; while(a[q-1]==1) q--; if(q>p) cout<<q-p<<endl; else//这种情况下全是土地没有水潭 cout<<"0"<<endl; }
总结:
大家在做题之前一定要理解题意呀!!!可不能白费功夫了