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");
}
View Code

 

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]);
}
View Code

 

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);
    }
} 
View Code

 

法二:动态规划

#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]);
    }
}
View Code

 

考场做法:二分 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);
    }
} 
View Code

 



posted @ 2017-09-05 15:44  TRTTG  阅读(204)  评论(0编辑  收藏  举报