LuoguP5639 【CSGRound2】守序者的尊严 题解

这题目怀疑和P4439撞Idea了,因为都差不多好吗!


首先我们来看这道题目,诶?这不就是算整体吗?然后立马想到了刚做的P4439,发现这两道题目Idea差不多,都是算一个序列里整体的个数。这道题目中,管理员\(Z\)每次只能走都是\(0\)的一段,而一开始必定是\(0\),所以小\(Z\)最少走过的秒数肯定是这一段里面所有整体的个数。所以这样就很简单了,\(O(n)\)做法轻松搞定。

下面贴上我的\(AC\)代码:

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;

int n, a[1000007], ans;

int main() {
	scanf("%d", &n);
	for(int i = 1; i <= n; ++i) {
		scanf("%d", &a[i]);
		if(i == 1)	ans++;
		if(i > 1 && a[i] != a[i - 1])	ans++;
	}
	printf("%d", ans);
	return 0;
}

今天早上碰到了@xieyi0408,然后他展示了一下他的写法,我发现他的比我的还要简单那么一点,所以把他的也贴一下:

#include<bits/stdc++.h>
#define int long long//好东西 
using namespace std;
int ans,now,last=-1,n;
int read(){
	int x=0,s=1;char c=getchar();
	while(c>'9'||c<'0'){if(c=='-')s=-1;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
	return x*s;
}
main(){
	n=read();
	for(int i=1;i<=n;i++){
		now=read();
		if(now!=last)last=now,ans++;
	}
	printf("%lld",ans);
}

他这个写法就是直接保存上一个点的状态,如果目前的状态比上一个状态不同就将last赋值为目前的状态,以便之后的比较,然后再将答案计数。


这两个代码都仅供参考,有什么不懂的请私信我或@xieyi0408

这次月赛是不是该调个顺序,感觉难度安排有点不妥

posted @ 2021-12-23 21:02  Eason_AC  阅读(64)  评论(0)    收藏  举报