第十一届北师大程序设计竞赛 by Zoo

来源:互联网 发布:结构的刚度矩阵怎么求 编辑:程序博客网 时间:2024/05/01 04:49

现场赛

team06 BJTU-01

队员:Ronnoc(5),MuQ~(4)

总共9 of 12

rank 1

以为被北航逆袭了

结果过了D的不是他们

榜单出来了...http://www.bnuoj.com/bnucpc/summary.htm

某北航罚时还被超了...

第一妥妥的

感觉3个没有出来的题DEG

D是树,E是贪心+搜索,G是搜索

没有全场的FB,只有I是局部的FB

表示有一个CE很忧伤....

报告

A题,MuQ~ 1Y

打表水题

#include<stdio.h>int main(){    char c[20][100]={"\0",                     "Unknown\0",                     "Spring Training\0",                     "Spring Training\0",                     "Spring Training\nBNU Contest\0",                     "Unknown\0",                     "Unknown\0",                     "Practice Week\nSummer Training\0",                     "Summer Training\0",                     "Regional Contest\0",                     "Regional Contest\0",                     "Basic Training\nRegional Contest\0",                     "Basic Training\nRookie Contest\0"};    int i,j,k,n;    scanf("%d",&n);    for(i=1;i<=n;i++)    {       scanf("%d",&j);       printf("%s\n",c[j]);    }    scanf("%d");    return 0;}


B题

MuQ~,不知道什么题,也不知道几Y,反正是过了

3Y

#include<stdio.h>int main(){    int a[1020][10],t,i,j,k,kk,n,l,x,y[10000];    scanf("%d",&t);    while(t--)    {       for(i=0;i<1020;i++)          for(j=0;j<10;j++)             a[i][j]=0;       scanf("%d%d%d",&l,&x,&n);       for(i=1;i<=n;i++)          scanf("%d",&y[i]);      a[x][0]=1;      for(j=1;j<=4;j++)       for(i=x+1;i<=l;i++)          for(k=1;k<=n;k++)             if(i-y[k]>=0)                if(a[i-y[k]][j-1])                   a[i][j]=1;       if(a[l][4])printf("Yes\n");       else printf("No\n");    }    return 0;}


C题

水题,可行的步数统计,奇偶性判断2Y

1CE...没有引用stdio的头文件

#include<math.h>#include<stdio.h>int main(){    int T;    scanf("%d",&T);    while(T--){        int L,H;        scanf("%d%d",&L,&H);        int res=0;        while(L%2==0&&L)L/=2,res++;        while(H%2==0&&H)H/=2,res++;        if(res%2)printf("Adidas loses\n");        else printf("Adivon prevails\n");        }    return 0;    }

F题

直接dp递推1TLE

心里面有个dp表格

dp[i][j]表示第i个元素拍中且是第j个连续的概率

转移方程

dp[i][0]=1-p

dp[i][j]=dp[i-1][j-1]*p

然后结果是FOR(i,1,n)FOR(j,1,i)res+=dp[i][j]*j;

这个事第一次的结果

然后手写出公式发现每一行可以O(1)的求出和

总O(n)

2Y

看程序

#include<stdio.h>#define N 1010double dp[N][N];double sum[N],cha[N]; int main(){    int T;    scanf("%d",&T);    while(T--){        int n;        double p;        scanf("%d%lf",&n,&p);        int i,j;        cha[1]=(1-p)*p;        sum[1]=p+cha[1]*(n-1);        for(i=2;i<=n;i++){            sum[i]=(sum[i-1]-cha[i-1])*p;            cha[i]=cha[i-1]*p;            }        double res=0;        for(i=1;i<=n;i++)res+=i*sum[i];        printf("%.6lf\n",res);        }        return 0;    }

H题

概率题

ai表示到刚好第i步的期望

推下公式即可

1RE数组开小了

2TLE时间开大了

3AC

#include<stdio.h>#define eps 1e-4double a[10010];double b[10010];int main(){    int T;    scanf("%d",&T);    while(T--){        double p,q,r;        scanf("%lf",&p);        q=p*p+(1-p)*(1-p);        r=1-q;        double sum=0;        a[0]=r;        int i;        for(i=1;i<=10000;i++)a[i]=a[i-1]*(i+1)/i*q;        for(i=0;i<=10000;i++)sum+=2*a[i];        printf("%.2lf\n",sum);        }    return 0;    }

I题

bi=ai*w{mod m}

w*v=1{mod m}

so

bi*v=ai{mod m}

ai<<m

ai=bi*v%m

s=∑(bixi)

v*s=∑(bixi*v)=∑(aixi)

ai是个背包

搞定

1WA于long long

2WA于%64d

3AC 改用cin

#include<stdio.h>#define LL long long#include<iostream>using namespace std;LL a[40],b[40],sum[40];LL x[40];int main(){    LL n,v,m,w,S;    int T;    cin>>T;    while(T--){        cin>>n;        int i,j;        for(i=1;i<=n;i++)cin>>b[i];        cin>>v>>m>>S;        for(i=1;i<=n;i++)        {            a[i]=v*b[i];a[i]%=m;            }        int res=0;        S*=v;S%=m;        for(i=n;i>=1;i--){            if(S>=a[i]){x[i]=1;S-=a[i];}            else x[i]=0;            }        for(i=1;i<=n;i++)printf("%d",x[i]);        printf("\n");        }    return 0;    }

J

查克拉,dp什么的

没看懂提

MuQ~过的1Y

#include<stdio.h>int main(){    long t,i,j,k,c,n,dp[10][10020],a[10020];    scanf("%ld%ld",&c,&n);    for(i=1;i<=n;i++)       scanf("%ld",&a[i]);    for(j=0;j<=n;j++)       dp[0][j]=c;    dp[1][0]=-1;    for(j=1;j<=n;j++)    {       dp[1][j]=dp[1][j-1];       if(dp[0][j]-a[j]>dp[1][j] && dp[0][j]!=-1)          dp[1][j]=dp[0][j]-a[j];    }    dp[2][0]=-1;    for(j=1;j<=n;j++)    {       dp[2][j]=dp[2][j-1];       if(dp[1][j]+a[j]>dp[2][j] && dp[1][j]!=-1)          dp[2][j]=dp[1][j]+a[j];    }    dp[3][0]=-1;    for(j=1;j<=n;j++)    {       dp[3][j]=dp[3][j-1];       if(dp[2][j]-a[j]>dp[3][j] && dp[2][j]!=-1)          dp[3][j]=dp[2][j]-a[j];    }    dp[4][0]=-1;    for(j=1;j<=n;j++)    {       dp[4][j]=dp[4][j-1];       if(dp[3][j]+a[j]>dp[4][j] && dp[3][j]!=-1)          dp[4][j]=dp[3][j]+a[j];    }    if(dp[4][n]==-1)printf("%ld\n",c);    else printf("%d\n",dp[4][n]);    return 0;}

K题

矩阵快乘

普通递推TLE

等价于a1s=1,a1j=0的列矩阵,不断乘一个n*n的矩阵

快乘log

总时间

n^3log(m*k)*T

1WA于矩阵建错了,和不是1

2WA,3WA忘记为什么了...

只记得有个trick,n=1

4AC

FB

#include<stdio.h>double G[55][25][25];double res[25][25];double tm[25][25];double aim[25],ha[25];int main(){    int T;    scanf("%d",&T);    while(T--){        int i,j,l,p,n,m,K,k,s;        scanf("%d%d%d%d",&n,&m,&K,&s);        int tp=m*K;        for(i=1;i<=n;i++)ha[i]=0;ha[s]=1;        for(i=1;i<=n;i++)for(j=1;j<=n;j++){            if(i==1&&j==2)G[0][j][i]=1.0;            else if(i==n&&j==n-1)G[0][j][i]=1.0;            else if(j==i+1||j==i-1)G[0][j][i]=0.5;            else G[0][j][i]=0;            res[i][j]=0;            if(i==j)res[i][i]=1.0;            }        for(p=1;p<=50;p++){            for(i=1;i<=n;i++)for(j=1;j<=n;j++){                G[p][i][j]=0;                for(k=1;k<=n;k++)G[p][i][j]+=G[p-1][i][k]*G[p-1][k][j];                }            }        for(p=0;p<=50;p++){            int flag=tp%2;tp/=2;            if(!flag)continue;            for(i=1;i<=n;i++)for(j=1;j<=n;j++)tm[i][j]=res[i][j];            for(i=1;i<=n;i++)for(j=1;j<=n;j++){                res[i][j]=0;                for(k=1;k<=n;k++)res[i][j]+=G[p][i][k]*tm[k][j];                }            }        for(i=1;i<=n;i++){            aim[i]=0;            for(k=1;k<=n;k++)aim[i]+=res[i][k]*ha[k];            }        for(i=1;i<=n;i++){            if(n==1)aim[i]=1.0;            if(i!=1)printf(" ");            printf("%.4lf",aim[i]);            }        printf("\n");        }    return 0;    }

L题

一个矩阵一条直线

计算几何

MuQ~1Y

#include<stdio.h>int main(){    double t,x1,x2,y1,y2,a,b,c,s;    double i1,i2,j1,j2,j3,j0;    double sum;    scanf("%lf",&t);    while(t--)    {       scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2);       scanf("%lf%lf%lf",&a,&b,&c);       s=(x2-x1)*(y2-y1);       j0=(-1*a*x1-c)/b;       j3=(-1*a*x2-c)/b;       if(j0>=y2 && j3>=y2)       {          sum=0;       }       if(j0>=y2 && j3<=y2 && j3>=y1)       {          i1=(-1*b*y2-c)/a;          sum=(x2-i1)*(y2-j3)/2;       }       if(j0>=y2 && j3<y1)       {          i1=(-1*b*y2-c)/a;          i2=(-1*b*y1-c)/a;          sum=(x2-i1+x2-i2)*(y2-y1)/2;       }              if(j0<y2 && j0>=y1 && j3>=y2)       {          i1=(-1*b*y2-c)/a;          sum=(i1-x1)*(y2-j0)/2;       }       if(j0<y2 && j0>=y1 && j3<y2 && j3>=y1)       {          sum=(y2-j3+y2-j0)*(x2-x1)/2;       }       if(j0<y2 && j0>=y1 && j3<y1)       {          i1=(-1*b*y1-c)/a;          sum=(j0-y1)*(i1-x1)/2;       }              if(j0<y1 && j3>=y2)       {          i1=(-1*b*y1-c)/a;          i2=(-1*b*y2-c)/a;          sum=(i1-x1+i2-x1)*(y2-y1)/2;       }       if(j0<y1 && j3<y2 && j3>=y1)       {          i1=(-1*b*y1-c)/a;          sum=(x2-i1)*(j3-y1)/2;       }       if(j0<y1 && j3<y1)       {          sum=0;       }              if(sum>s/2)sum=s-sum;       if(sum==0)sum=s;       printf("%.3lf\n",sum);    }    return 0;}



比赛小结

结果不错(恩恩~~)

D拘束是字典树不会,EG都TLE不太会剪枝

开局我不是很顺,CE,RE都出了,不过后来踏下心来切概率还是不错的

最不爽的就是尼玛....电脑经常重启...

貌似MuQ~状态不错

本场比赛概率||dp好多啊...

最后1h有队伍过D

以为是北航...

抓狂死...

继续on my fighting way

还有感谢bnu某人的招待!!!

以上



原创粉丝点击