[Luogu] P9517 题解
P9517 题解
题意化简:给出一个有 \(n\) 个数的数列 \(a_1,a_2,a_3,...,a_n\),求从第一个等于 \(1\) 的 \(a_l\) 到最后一个等于 \(1\) 的 \(a_r\) 之间共有几个数 (包括 \(a_l\) 与 \(a_r\))。
由样例 \(1\) 可知,\(a_l\) 与 \(a_r\) 都是 \(a_4\),所以这两个数之间只有它自己 \(1\) 个数,输出 \(1\)。
由样例 \(2\) 可知,\(a_l=a_3\),\(a_r=a_6\),\(a_3\) 到 \(a_6\) 之间共有 \(4\) 个数,输出 \(4\)。
可以发现,数的数量就是 \(r-l+1\),于是有了下列代码。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,a[11451419],l,r;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);//加速cin,cout
cin>>n;
for(ll i=0;i<n;++i){
cin>>a[i];
}
for(ll i=0;i<n;++i){
if(a[i]==1){
l=i;
break;//记录第一个等于1的a[i]的序号
}
}
for(ll i=n-1;i>=0;--i){
if(a[i]==1){
r=i;
break;//记录最后一个等于1的a[i]的序号
}
}
cout<<r-l+1;
return 0;
}
结果 WA 了第一个点,发现题目中有说到“你有可能一个瓶子都不需要拿起来”,没有特判所有数都为 \(0\) 的情况。
在所有数都为 \(0\) 的情况下,输出 \(0\) 即可,否则输出 \(r-l+1\)。
优化:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,a[11451419],l,r;
bool x=false;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
cin>>n;
for(ll i=0;i<n;++i){
cin>>a[i];
if(a[i]==1) x=true;//若出现1,则用x=true标记
}
if(x==false){//特判所有瓶子都没水的情况
cout<<0;
return 0;
}
else
for(ll i=0;i<n;++i){
if(a[i]==1){
l=i;
break;
}
}
for(ll i=n-1;i>=0;--i){
if(a[i]==1){
r=i;
break;
}
}
cout<<r-l+1;
return 0;
}

浙公网安备 33010602011771号