您的位置:首页 > 其它

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

2011-12-19 22:58 295 查看
具体分析见:

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 1000000009

void 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
=dis(p
,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
,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
);
    }
    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 11000001
bool f
;

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("");
    }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: