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。
这次月赛是不是该调个顺序,感觉难度安排有点不妥

浙公网安备 33010602011771号