P6444 【[COCI2010-2011#1] PROFESOR 】
阿新 • • 發佈:2020-08-28
用\(a_i\)和\(b_i\)表示同桌的兩個成績
\(e_{i,l}\)表示以\(i\)結尾,連續的\(a_i\)的長度
\(e_{i,r}\)表示以\(i\)結尾,連續的\(b_i\)的長度
那麼就可以在輸入時統計出以上的資訊,並求出最長的\(l\),又因為使得\(k\)最小,再迴圈一次就可以了
#include<bits/stdc++.h> #define MAXN 100000 using namespace std; int n; int a[MAXN],b[MAXN]; struct node{ int l,r; }e[MAXN]; int main(){ scanf("%d",&n); for(register int i=1;i<=n;i++){ e[i].l=e[i].r=1; scanf("%d%d",&a[i],&b[i]); if(a[i-1]==b[i-1]&&a[i]==a[i-1]) e[i].l+=e[i-1].l; else if(a[i]==a[i-1]) e[i].l+=e[i-1].l; else if(a[i]==b[i-1]) e[i].l+=e[i-1].r; if(a[i-1]==b[i-1]&&b[i]==a[i-1]) e[i].r+=e[i-1].l; else if(b[i]==a[i-1]) e[i].r+=e[i-1].l; else if(b[i]==b[i-1]) e[i].r+=e[i-1].r; } int lmax=1,k=999; for(register int i=1;i<=n;i++){ if(e[i].l>lmax) lmax=e[i].l; if(e[i].r>lmax) lmax=e[i].r; } for(register int i=1;i<=n;i++){ if(e[i].l==lmax) k=min(k,a[i]); if(e[i].r==lmax) k=min(k,b[i]); } printf("%d %d",lmax,k); return 0; }