NOIP模拟1
期望得分:100+100+100=300
实际得分:94+96+97=287
T1 #6090. 「Codeforces Round #418」尘封思绪
#include<cstdio> #define N 102 using namespace std; int a[N],b[N]; int main() { int n,m; scanf("%d%d",&n,&m); if(m>1) { printf("Yes"); return 0; } if(!m) { for(int i=1;i<=n;i++) if(a[i]<a[i-1]) { printf("Yes"); return 0; } printf("No"); return 0; } int pos; for(int i=1;i<=n;i++) { scanf("%d",&a[i]); if(!a[i]) { pos=i; continue;} if(a[i]<a[i-1]) { printf("Yes"); return 0; } } scanf("%d",&m); a[n+1]=201; if(m<a[pos-1] || m>a[pos+1]) { printf("Yes"); return 0; } printf("No"); }
T1 #6091. 「Codeforces Round #418」幻想特快
#include<cstdio> #define N 1001 using namespace std; int a[N],b[N]; int p[3],fa,fb; int v[N]; int main() { int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); if(!v[a[i]]) v[a[i]]=i; else fa=i; } for(int i=1;i<=n;i++) { scanf("%d",&b[i]); if(a[i]!=b[i]) p[++p[0]]=i; } int k; for(int i=1;i<=n;i++) if(!v[i]) { k=i; break; } if(p[0]==1) { a[p[1]]=k; for(int i=1;i<=n;i++) printf("%d ",a[i]); return 0; } if(b[fa]==k) a[fa]=k; else a[v[a[fa]]]=k; for(int i=1;i<=n;i++) printf("%d ",a[i]); }
T3 LOJ #6092. 「Codeforces Round #418」恋爱循环
法一: 尺取法
#include<cstdio> #include<algorithm> #define N 1501 using namespace std; char s[N]; int main() { int n,q; scanf("%d",&n); scanf("%s",s+1); scanf("%d",&q); int l,r,now,ans,m; char c[2]; while(q--) { scanf("%d%s",&m,c); now=ans=0; r=0,l=1; while(1) { while(r<=n && now<=m) if(s[++r]!=c[0]) now++; ans=max(ans,r-l); if(r>=n) break; while(l<=n && now>m) if(s[l++]!=c[0]) now--; } printf("%d\n",ans); } }
法二:动态规划
#include<cstdio> #include<cstring> #include<algorithm> #define N 1501 using namespace std; char s[N]; int ans[26][N]; int main() { int n,sum; scanf("%d",&n); scanf("%s",s+1); for(int k=0;k<26;k++) { for(int i=1;i<=n;i++) { sum=0; for(int j=i;j<=n;j++) { if(s[j]-'a'!=k) sum++; ans[k][sum]=max(ans[k][sum],j-i+1); } } for(int i=1;i<=n;i++) ans[k][i]=max(ans[k][i],ans[k][i-1]); } int q; scanf("%d",&q); int m; char c[2]; while(q--) { scanf("%d%s",&m,c); printf("%d\n",ans[c[0]-'a'][m]); } }
考场做法:二分 TLE1个点
#include<cstdio> #include<iostream> #define N 1501 using namespace std; char s[N],c[2]; int n,m; inline bool check(int mid) { int now=0; for(int i=1;i<=mid;i++) if(s[i]!=c[0]) now++; if(now<=m) return true; for(int i=mid+1;i<=n;i++) { if(s[i-mid]!=c[0]) now--; if(s[i]!=c[0]) now++; if(now<=m) return true; } return false; } inline void read(int &x) { x=0; char c=getchar(); while(!isdigit(c)) c=getchar(); while(isdigit(c)) { x=x*10+c-'0'; c=getchar(); } } int main() { read(n); scanf("%s",s+1); int q,l,r,mid,ans; read(q); while(q--) { read(m); scanf("%s",c); ans=0; l=m,r=n; while(l<=r) { mid=l+r>>1; if(check(mid)) ans=mid,l=mid+1; else r=mid-1; } printf("%d\n",ans); } }