bnuoj 中国地质大学(北京)第三届程序设计竞赛

来源:互联网 发布:java linkedhashmap 编辑:程序博客网 时间:2024/04/28 10:47
4047 魔方系列——相同高度

此题相当于求最少移动块数

#include<stdio.h>int main(){    int n,i;    int sum,avg,num;    int a[550];    while(~scanf("%d",&n),n)    {        sum=0,avg=0,num=0;        for(i=0;i<n;i++)        {            scanf("%d",&a[i]);            sum+=a[i];        }        if(sum%n) puts("Impossible");        else        {            avg=sum/n;            for(i=0;i<n;i++)            if(a[i]>avg) num+=a[i]-avg;        printf("%d\n",num);        }    }return 0;}
4049 四叉树 转自bnuoj

#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int N = 333;string ans[N];int a[16][16];int n;bool judge(int lx, int ly, int rx, int ry){    int i,j;    for (i=lx;i<=rx;i++)        for(j=ly;j<=ry;j++)        if(a[i][j]!= a[lx][ly]) return false;    return true;}void dfs(int lx, int ly, int rx, int ry,int d){    if (judge(lx, ly, rx, ry))    {        if (a[lx][ly]==0)            ans[d]+="00";        else            ans[d]+="01";        return;    }    ans[d] += "1";    int mx = (lx + rx) / 2;    int my = (ly + ry) / 2;    dfs(lx, ly, mx, my, d+1);    dfs(lx, my+1, mx, ry, d+1);    dfs(mx+1,ly,rx,my,d+1);    dfs(mx+1,my+1,rx,ry,d+1);}int main(){    int i,j;    while(~scanf("%d",&n))    {        for (i=0;i<n;i++)            for (j=0;j<n;j++)            scanf("%d",&a[i][j]);        for (int i=0;i<N;i++) ans[i] = "";        dfs(0,0,n-1,n-1,0);        for (i=0;i<N;i++) cout<<ans[i];        cout<<endl;    }    return 0;}

4050  五角数
根据题目找规律即可 预处理一下,注意提示,最后输出空格即可,

#include<stdio.h>int main(){    int n,i,j;    int a[10000+5];    a[1]=1;//j表示每次递增的值,每次增加3    for(i=2,j=1;i<10001;i++)        a[i]=a[i-1]+(j+=3);    scanf("%d",&n);    printf("%d ",a[n]);    return 0;}
4052  BT马 (来自分享)

<pre name="code" class="cpp">1、 #include<cstdio>#include<iostream>#include<algorithm>using namespace std;int main(){    int a,b,c,d,k,n; while(~scanf("%d%d",&c,&d))    {        scanf("%d",&n);        a=min(c,d);        b=max(c,d);        int k=a/n;        if(b>=k*n&&b<=k*n+k&&(a+b)%(2*n+1)==0)            puts("Yes");        else            puts("No");    }    return 0;}2、#include<stdio.h>#include<stdlib.h>int main(){    int x,y,n;    while(scanf("%d%d",&x,&y))    {        scanf("%d",&n);        int sum=n+n+1;        int avg=(x+y)/sum;        if(x&&y&&(x+y)%sum==0&&abs(x-y)<=avg)            puts("Yes");        else            puts("No");    }return 0;}

4053 一个很city的问题
找规律,从i=1开始 a[i]=a[i-1]*2+i-1,注意每次取模

#include<stdio.h>#define mod 10111009int main(){    int m,n,i,j;    int a[1000+10]={0};    for(i=1;i<=1000;i++)        a[i]=(a[i-1]<<1)%mod+i-1;    while(scanf("%d",&n)==1)    printf("%d\n",a[n]);}

4054 Set the memory

只有两种状态,定义变量标记即可

#include<stdio.h>#include<string.h>#include<stdlib.h>int main(){    int m,n,i,j;    char str[10005];    char flag;    int ans;    while(~scanf("%s",str)){        ans=0;        flag='0';        for(i=0;i<strlen(str);i++)        {            if(str[i]!=flag){                ans++;                if(flag=='1') flag='0';                else flag='1';            }        }        printf("%d\n",ans);    }    return 0;}
4057 魔方系列——最小装箱

#include<stdio.h>int main(){int a,b,c,d,e,f,g,h,sum;int s[4]={0,5,3,1};//si表示装i个3,剩下可以装i个2(i>=0);int t;scanf("%d",&t);while(t--){        scanf("%d%d%d%d%d%d",&a,&b,&c,&d,&e,&f);        /*小技巧,一个箱子,可以装4个3*3,但是如果只有一个3*3也要装新箱子,这里这样写省去判断有几个3*3的魔方*/        sum=f+e+d+(c+3)/4;        int g=s[c%4]+5*d;//表示壮丽装了4*4和3*3的箱子,还可以装几个2*2的        if(b>g) sum+=(b-g+8)/9;//+8同样道理,多一个2*2就要装新箱子        h=36*sum-36*f-25*e-16*d-9*c-b*4; //1*1的箱子        if(a<=h) printf("%d\n",sum);        else printf("%d\n",sum+(a-h+35)/36);}return 0;}








0 0