2011百校联动“菜鸟杯”程序设计公开赛-解题报告

来源:互联网 发布:黑马程序员 达内 编辑:程序博客网 时间:2024/06/11 06:05

具体分析见:

http://page.renren.com/601081183/note/791507956?ref=minifeed&sfet=2012&fin=5&ff_id=601081183&feed=page_blog&tagid=791507956&statID=page_601081183_2&level=1

下面部分是转载的。

4143 :a simple game

#include <iostream>#include<math.h>using namespace std;#define N 1000000009void solve(int n){    int i,flag=0,k;    int min=N;    for(i=1;i<=sqrt(n)+1;i++)    {        if(n%i==0)        {            k=1;            int r=n/i;            if(r>=i)                k=r-i;            else                k=i-r;            if(k%2==0&&k!=0)            {               flag=1;               int  x=k/2;               if(x<min)                   min=x;            }            }    }    if(!flag)        printf("-1\n");    else        printf("%d\n",min);}int main(){    int n;    int t;    scanf("%d",&t);        while(t--)    {        scanf("%d",&n);        solve(n);    }    return 0;}

4144 :Bacon's Cipher

#include<iostream>#include<math.h>using namespace std;int hroh(int a[]){    int s=0,i;    for(i=4;i>=0;i--)        s=s+a[4-i]*(int)pow((float)2,(float)i);    return s;}int main(){    int l;    char a[10001];    while(cin>>l>>a)    {        int i,k=0,j=0,c[2001];        int b[5];            for(i=0;i<l;i++)            {k++;                if(a[i]>='A'&&a[i]<='Z')                {b[i%5]=0;}            else                if(a[i]>='0'&&a[i]<='9')                {    b[i%5]=1;}            if(k%5==0)            {c[j++]=hroh(b);}            }                    for(i=0;i<j;i++)    //    printf("%d ",c[i]+65);cout<<endl;    //            for(i=0;i<j;i++)        printf("%c",c[i]+65);                    cout<<endl;    }}

4145

#include<stdio.h>#include<string.h>#include<algorithm>using namespace std;struct point {    double x,y;}p[100010],a,b;double dis(point a,point b){    return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);}int cmp(point x,point y){    return dis(x,a)<dis(y,a);}double max(double a,double b){    return a>b?a:b;}double min(double a,double b){    return a<b?a:b;}double aa[100010];int main(){    int t;    int i,j,n;    scanf("%d",&t);    while(t--)    {        scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y);        scanf("%d",&n);        for(i=1;i<=n;i++)        {            scanf("%lf%lf",&p[i].x,&p[i].y);        }        double ans=1000000000;        sort(p+1,p+n+1,cmp);        aa[n]=dis(p[n],b);        for(i=n-1;i>=1;i--)        {            aa[i]=max(dis(p[i],b),aa[i+1]);        }        double tmp=aa[1];        for(i=1;i<n;i++)        {            tmp=min(tmp,aa[i+1]+dis(p[i],a));        }        tmp=min(dis(p[n],a),tmp);        printf("%.0lf\n",tmp);    }}

4146

#include <iostream>#include <cstdio>#include <cstring>using namespace std;const int MAXN=1024;int map[MAXN][MAXN];int row[MAXN];int col[MAXN];char buffer[MAXN];int read(){    int ret=0;    char c;    while((c=getchar())==' '||c=='\n'||c=='\r');        ret=c-'0';    while((c=getchar())!=' '&&c!='\n'&&c!='\r')            ret=ret*10+c-'0';        return ret;}int main(){    int n,i,j;    char ch;    int t;    int casenum;    t=read();    for(casenum=1; casenum<=t; casenum++)     {        memset(row,0,sizeof(row));        memset(col,0,sizeof(col));        n=read();        for(i=1; i<=n; i++) {            scanf("%s",buffer+1);            for(j=1; j<=n; j++) {                map[i][j]= (buffer[j]=='b' ? 0: 1);            }        }        int opnum;        int a,b;        opnum=read();        while(opnum--) {            a=read();            b=read();            row[a]=!row[a];            col[b]=!col[b];        }        int ans=0;        for(i=1; i<=n; i++) {            for(j=1; j<=n; j++) {                if(row[i]^col[j]) map[i][j]=!map[i][j];                ans+=map[i][j];            }        }        printf("Case #%d: ",casenum);        printf("%d\n",ans);    }    return 0;}

4147

#include<iostream>#include <string>using namespace std;int main(){    string t;    int n,B,D,f,F;    int ans;    int i,j,cnt_a,cnt_b,cnt_c;    while(cin>>n>>B>>D>>f>>F){        ans=~0U>>1;                for(j=1; j<=n; j++){            cnt_a=0;            cnt_b=0;            cnt_c=0;            cin>>t;            for(i=0; i<t.size(); i++){                switch(t[i]){                case 'A':cnt_a++;break;                case 'B':cnt_b++;break;                case 'C':cnt_c++;break;                }            }            int now=cnt_a*B + cnt_a*D + cnt_a*f;            now+=cnt_b*2*B + cnt_b*D*2 + cnt_b*F;            now+=cnt_c*3*B + cnt_c*D*3 + cnt_c*F*2;            if(now<ans) ans=now;        }        cout<<ans<<endl;    }    return 0;}

4148

#include<iostream>using namespace std;int s[40];char str[40][10000];void solve(){    int i,j,q;    s[1]=1;    s[2]=2;    str[2][0]='1';  str[2][1]='1';  str[2][2]='\0';        for(i=3;i<=30;i++)    {        int len=strlen(str[i-1]);        int k=0;            for(j=0;j<len;j++)        {            char t=str[i-1][j];int cnt=0;            for(q=j;q<len;q++)            {                if(str[i-1][j]==str[i-1][q])                {                    cnt++;                }                else                    break;            }            j=q-1;            str[i][k++]=cnt+'0';            str[i][k++]=t;        }        str[i][k]='\0';        len=strlen(str[i]);    //    puts(str[i]);        s[i]=len;    }    }int main(){    solve();    int n;        while(cin>>n&&n)    {        printf("%d\n",s[n]);    }    return 0;}

4149

#include<stdio.h>int main(){    int cas;    scanf("%d",&cas);    while(cas--)    {        int x[8],sum,i;        for( i=0; i<8; i++)        {            scanf("%d",&x[i]);        }        scanf("%d",&sum);        int jin=0,flag=1;        int ans[35],at=0;        while(flag)        {            int now=0; //表示当前这位只和             flag=0;            for( i=0; i<8; i++)            {                now+=1& x[i];                x[i]=x[i]>>1;                if(x[i]!=0) flag=1;            }            if((now+jin)%2==0)            {                if((1&sum)==1)                 {                    ans[at++]=1;                    jin=(8-now+jin)/2; //如果当前这些位是取反的,需要8-now,jin(进位)不影响                 }                else                 {                    ans[at++]=0;                    jin=(now+jin)/2;                }            }            else            {                if((1&sum)==1)                 {                    ans[at++]=0;                    jin=(now+jin)/2;                }                else                 {                    ans[at++]=1;                    jin=(8-now+jin)/2;                }            }            sum=sum>>1;            if(jin!=0 || sum!=0) flag=1;        }        int res=0,two=1;        for(i=0; i<at; i++)        {            res+=two*ans[i];            two*=2;        }        printf("%d\n",res);    }    return 0;}

4150

#include<iostream>using namespace std;char str[1000009];char temp[10];int main(){    int t,i,j;    cin>>t;        while(t--)    {        int ans=0;        scanf("%s%s",str,temp);    //    cin>>str;cin>>temp;        int lena=strlen(str);        int lenb=strlen(temp);                int l=0;        for(i=0;i<lena;i++)        {            if(str[i]==temp[0])            {                int l=i+1;                for(j=1;j<lenb;j++,l++)                {                    if(str[l]!=temp[j])                        break;                }                if(j==lenb)                {                    ans++;                    i=l-1;                }            }            }        printf("%d\n",ans);                    }        return 0;}

4151  这题可以二分。。我是很暴力的。。

#include<iostream>using namespace std;#define N 11000001bool f[N];void solve(){    int i,j,k,l,m,n,o,p,q;    for(i=1;i<=9;i++)        f[i]=1;        for(i=1;i<=9;i++)        for(j=0;j<=9;j++)        {            if(i!=j)                f[i*10+j]=1;        }                for(i=1;i<=9;i++)        {            for(j=0;j<=9;j++)            {                if(i!=j)                    for(k=0;k<=9;k++)                        if(j!=k&&k!=i)                            f[i*100+j*10+k]=1;                }                     }                for(i=1;i<=9;i++)        {            for(j=0;j<=9;j++)                {                if(j!=i)                 {                    for(k=0;k<=9;k++) {                        if(k!=j&&k!=i) {                            for(l=0;l<=9;l++)                                if(l!=k&&l!=j&&l!=i)                                    f[i*1000+j*100+k*10+l]=1;                        }                                            }                                    }            }                    }        for(i=1;i<=9;i++){            for(j=0;j<=9;j++)     {                if(j!=i) {                    for(k=0;k<=9;k++) {                        if(k!=j&&k!=i) {                            for(l=0;l<=9;l++)                                if(l!=k&&l!=i&&l!=j)                                {                                    for(m=0;m<=9;m++)                                        if(m!=l&&m!=i&&m!=j&&m!=k)                                            f[i*10000+j*1000+k*100+l*10+m]=1;                                }                        }                                            }                                    }            }                    }        for(i=1;i<=9;i++){            for(j=0;j<=9;j++)     {                if(j!=i) {                    for(k=0;k<=9;k++) {                        if(k!=j&&k!=i) {                            for(l=0;l<=9;l++)                                if(l!=k&&l!=i&&l!=j)                                {                                    for(m=0;m<=9;m++)                                        if(m!=l&&m!=i&&m!=j&&m!=k)                                        {                                            for(n=0;n<=9;n++)                                                if(n!=m&&n!=i&&n!=j&&n!=k&&n!=l)                                                                                                        f[i*100000+j*10000+k*1000+l*100+m*10+n]=1;                                        }                                }                        }                                            }                                    }            }                    }        for(i=1;i<=9;i++){            for(j=0;j<=9;j++)     {                if(j!=i) {                    for(k=0;k<=9;k++) {                        if(k!=j&&k!=i) {                            for(l=0;l<=9;l++)                                if(l!=k&&l!=i&&l!=j)                                {                                    for(m=0;m<=9;m++)                                        if(m!=l&&m!=i&&m!=j&&m!=k)                                        {                                            for(n=0;n<=9;n++)                                                if(n!=m&&n!=i&&n!=j&&n!=k&&n!=l)                                                {                                                    for(o=0;o<=9;o++)                                                        if(o!=n&&o!=i&&o!=j&&o!=k&&o!=l&&o!=m)                                                            f[i*1000000+j*100000+k*10000+l*1000+m*100+n*10+o]=1;                                                }                                        }                                }                        }                                            }                                    }            }                    }                }int main(){    solve();    int n;    int ans=0,i;    while(cin>>n)    {        ans=0;        for(i=1;i<n;i++)            if(f[i])                ans++;        printf("%d\n",ans);    }        return 0;}

4152

#include<cstdio>#include<cstring>int hab[20][25];int main(){    int n,m;    int i,j,k;    int sat[25];    while(scanf("%d",&n) != EOF)    {        for( i=0; i<n; i++)   scanf("%d",&sat[i]);                scanf("%d",&m);                for( i=0; i<m; i++)        {            for( j=0; j<n; j++)            {                scanf("%d",&hab[i][j]);            }        }                int res=0,r[20];                int to=1<<m;                for( i=1; i<to; i++)        {            int tr[20],tt=0;                        int tsat[25];                        memset(tsat,0,sizeof(tsat));                        for( j=0; j<m; j++) if( (i>>j) & 1)            {                tr[tt++]=j;                for( k=0; k<n; k++)                {                    tsat[k]+=hab[j][k];                }            }            int flag=1;            for(int j=0; j<n; j++)            {                if(tsat[j]<sat[j])                 {                    flag=0; break;                }            }            if(flag && tt==res){                for( j=0; j<tt; j++)                {                    if(tr[j]>r[j])                     {                        flag=0; break;                    }                }            }            if(flag && tt>=res)            {                res=tt;                for( j=0; j<res; j++)                {                    r[j]=tr[j];                }            }        }        printf("%d",res);        for(int i=0; i<res; i++)        {            printf(" %d",r[i]+1);        }        puts("");    }}


原创粉丝点击