NOIP2008提高组

来源:互联网 发布:php网页自动跳转代码 编辑:程序博客网 时间:2024/05/22 13:55

2008提高
A.笨小猴(模拟+素数)
B.火柴棒等式(搜索/模拟+枚举)
C.传纸条(dp)
题解见 http://blog.csdn.net/icefox_zhx/article/details/77417642
D.双栈排序(二分图判断+栈模拟)
题解见 http://blog.csdn.net/icefox_zhx/article/details/78151279

A

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 105inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();    return x*f;}char s[N];int mn=200,mx=0,num[150];inline bool isprime(int x){    if(x==0||x==1) return 0;    for(int i=2;i*i<=x;++i)        if(x%i==0) return 0;    return 1;}int main(){//  freopen("a.in","r",stdin);    scanf("%s",s+1);    int n=strlen(s+1);    for(int i=1;i<=n;++i) num[s[i]]++;    for(int i='a';i<='z';++i){        if(num[i]==0) continue;        mx=max(mx,num[i]);mn=min(mn,num[i]);    }    if(isprime(mx-mn)) printf("Lucky Word\n%d\n",mx-mn);    else printf("No Answer\n0\n");    return 0;}

B

#include<cstdio>int n,a[20000]={6,2,5,5,4,5,6,3,7,6},s[20000],ans=0;int main(){    scanf("%d",&n);    if(n>=13){        for(int i=10;i<=99;i++){            a[i]=a[i/10]+a[i%10];        }        for(int i=100;i<=999;i++){            a[i]=a[i/100]+a[i%100/10]+a[i%10];        }        for(int i=1000;i<=1998;i++){            a[i]=a[i/1000]+a[i%1000/100]+a[i%100/10]+a[i%10];        }        for(int i=0;i<=999;i++){            for(int j=0;j<=999;j++){                if(a[i]+a[j]+a[i+j]==n-4) ans++;            }        }    }    printf("%d",ans);    return 0;} 

C

#include <bits/stdc++.h>inline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();    return x*f;}inline int min(int x,int y){return x<y?x:y;}inline int max(int x,int y){return x>y?x:y;}#define N 52int f[N<<1][N][N],n,m,a[N][N];int main(){//  freopen("a.in","r",stdin);    m=read();n=read();m--;n--;    for(int i=0;i<=m;++i)        for(int j=0;j<=n;++j) a[i][j]=read();    memset(f,128,sizeof(f));f[0][0][0]=0;    for(int i=1;i<=n+m;++i)        for(int j=0;j<=m&&j<=i;++j)            for(int k=0;k<=m&&k<=i;++k){                f[i][j][k]=max(max(f[i-1][j][k],f[i-1][j][k-1>0?k-1:0]),max(f[i-1][j-1>0?j-1:0][k],f[i-1][j-1>0?j-1:0][k-1>0?k-1:0]));                f[i][j][k]+=a[j][i-j];                if(j!=k) f[i][j][k]+=a[k][i-k];            }    printf("%d\n",f[n+m][m][m]);    return 0;       }

D

#include <bits/stdc++.h>using namespace std;#define N 1010#define ll long long#define inf 0x3f3f3f3finline int read(){    int x=0,f=1;char ch=getchar();    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();    return x*f;}int n,a[N],mn[N],h[N],num=0,col[N],s1[N],s2[N],top1=0,top2=0;struct edge{    int to,next;}data[N*N<<1];inline void add(int x,int y){    data[++num].to=y;data[num].next=h[x];h[x]=num;    data[++num].to=x;data[num].next=h[y];h[y]=num;}bool dfs(int x){//二分图染色     for(int i=h[x];i;i=data[i].next){        int y=data[i].to;if(col[y]==col[x]) return 0;        if(col[y]!=-1) continue;        col[y]=col[x]^1;if(!dfs(y)) return 0;    }return 1;}int main(){//  freopen("a.in","r",stdin);    n=read();for(int i=1;i<=n;++i) a[i]=read();mn[n+1]=inf;    for(int i=n;i>=1;--i) mn[i]=min(a[i],mn[i+1]);    for(int i=1;i<=n;++i)        for(int j=i+1;j<=n;++j)//i,j一定不同栈             if(a[i]<a[j]&&mn[j+1]<a[i]) add(i,j);    memset(col,-1,sizeof(col));    for(int i=1;i<=n;++i) if(col[i]==-1){//没染过色,优先进第一个栈         col[i]=0;if(!dfs(i)){puts("0");return 0;};    }int now=1;    for(int i=1;i<=n;++i){//模拟输出         if(col[i]){printf("c ");s2[++top2]=a[i];}        else{printf("a ");s1[++top1]=a[i];}        while(s1[top1]==now||s2[top2]==now){            if(s1[top1]==now){putchar('b');--top1;}            else {putchar('d');--top2;}            if(now!=n) putchar(' ');now++;        }    }return 0;}
原创粉丝点击