现场赛
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;
}
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 1010
double 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-4
double 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某人的招待!!!
以上