[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;
}
posted @ 2023-11-17 20:35  FurippuWRY  阅读(24)  评论(0)    收藏  举报