1. 程式人生 > 其它 >LuoguP5639 【CSGRound2】守序者的尊嚴 題解

LuoguP5639 【CSGRound2】守序者的尊嚴 題解

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

這次月賽是不是該調個順序,感覺難度安排有點不妥