LuoguP5639 【CSGRound2】守序者的尊嚴 題解
阿新 • • 發佈:2021-12-23
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。
這次月賽是不是該調個順序,感覺難度安排有點不妥