NOIP2004提高组

来源:互联网 发布:字体管家软件下载 编辑:程序博客网 时间:2024/06/05 13:31

2004提高
A.津津的储蓄计划(模拟)
B.合并果子(贪心+优先队列)
C.合唱队形(dp)
D.虫食算(搜索+数学)

A

#include<cstdio>int a,b,s=0,n,ans=0,i,flag=0;int main(){    //freopen("eg.in","r",stdin);    for(i=1;i<=12;i++){        scanf("%d",&a);b=300+s-a;        if(b<0){flag=1;break;}        else n=b/100,ans=ans+n,s=b-n*100;    }    if(flag==1) printf("-%d",i);    else printf("%d",ans=ans*120+s);    return 0;}

B

#include<cstdio>#include<queue>using namespace std;priority_queue<int,vector<int>,greater<int> >q;int main(){    int n,ans=0;    scanf("%d",&n);    for(int i=1;i<=n;i++){        int x;scanf("%d",&x);q.push(x);    }    for(int i=1;i<n;i++){        int t=0;t+=q.top();q.pop();        t+=q.top();q.pop();        q.push(t);ans+=t;    }    printf("%d",ans);    return 0;}

C

#include<cstdio>int n,a[101],f1[101],f2[101],ans=0;int main(){    //freopen("a.in","r",stdin);    scanf("%d",&n);    for(int i=1;i<=n;++i) scanf("%d",&a[i]);    for(int i=1;i<=n;++i){  //求从左到右最长上升子序列         f1[i]=1;        for(int j=1;j<i;++j)            if(a[j]<a[i]&&f1[j]+1>f1[i]) f1[i]=f1[j]+1;    }    for(int i=n;i>=1;--i){ //求从右到左最长上升子序列         f2[i]=1;        for(int j=i+1;j<=n;++j)            if(a[j]<a[i]&&f2[j]+1>f2[i]) f2[i]=f2[j]+1;    }    for(int i=1;i<=n;++i) //找留下最多人的         if(f1[i]+f2[i]-1>ans) ans=f1[i]+f2[i]-1;    printf("%d",n-ans); //求的是最少走多少人     return 0;}

D

#include<cstdio>#include<cstring>#include<cstdlib>int n,a[4][28],ans[28],map[4][28];char s[28];bool flag=false,f[28],exi=false;bool check(int i){    while(i--)        if(ans[a[1][i]]!=-1&&ans[a[2][i]]!=-1&&ans[a[3][i]]!=-1){            int k=ans[a[1][i]]+ans[a[2][i]],x=ans[a[3][i]];            if((k+1)%n==x||k%n==x) continue;            return 0;        }    return 1;}void dfs(int x,int y,int v,bool flag){    if(x==1&&y==0){        for(int i=1;i<=n;i++) printf("%d ",ans[i]);exit(0);    }    if(!check(y)) return;    if(x==3){        if(v>=n) flag=1,v-=n;        if(ans[a[x][y]]==-1){            if(!f[v]) return;            f[v]=0;ans[a[x][y]]=v;            dfs(1,y-1,0,flag);            f[v]=1;ans[a[x][y]]=-1;        }        else{            if(ans[a[x][y]]!=v) return;            dfs(1,y-1,0,flag);        }    }    else{        if(flag) v+=1,flag=0;        if(ans[a[x][y]]==-1)            for(int j=n-1;j>=0;--j){                if(!f[j]) continue;                f[j]=0;ans[a[x][y]]=j;                dfs(x+1,y,v+j,flag);                f[j]=1;ans[a[x][y]]=-1;            }               else dfs(x+1,y,v+ans[a[x][y]],flag);    }    }int main(){    //freopen("a.in","r",stdin);    scanf("%d",&n);    for(int i=1;i<=3;++i){        scanf("%s",s);        for(int j=0;j<n;++j) a[i][j+1]=s[j]-'A'+1;    }    memset(ans,-1,sizeof(ans));    memset(f,1,sizeof(f));    dfs(1,n,0,0);    return 0;}
原创粉丝点击