一、第J题坑爹大水题,模拟一下就行了
J:Contest Print Server
【题解】:
题目大意:输入 n,s,x,y,mod 分别队伍数n,还有一个s生成函数 s=((s*x)+y)%mod,就是打印机根据要求打印纸张,打印到s时,打印机将重置,生成新的s
【code】:
1 #include <iostream> 2 #include <cstdio> 3 #include <string.h> 4 using namespace std; 5 6 int main() 7 { 8 int t; 9 scanf("%d",&t); 10 while(t--) 11 { 12 int n,s,x,y,mod,i,p; 13 char team[30],str[20]; 14 int cnt = 0; 15 scanf("%d%d%d%d%d",&n,&s,&x,&y,&mod); 16 for(i=0;i<n;i++) 17 { 18 scanf("%s%s%d%s",team,str,&p,str); 19 while(1) 20 { 21 if(p<=s-cnt) 22 { 23 cnt+=p; 24 printf("%d pages for %s\n",p,team); 25 break; 26 } 27 else 28 { 29 printf("%d pages for %s\n",s-cnt,team); 30 s = ((s*x)+y)%mod; 31 cnt = 0; 32 } 33 } 34 } 35 putchar(10); 36 } 37 return 0; 38 }
二、第I题概率DP问题
I:The number of steps
【题解】:
1
/ \
2 — 3
/ \ / \
4 — 5 — 6
输入概率:a b c d e 分别表示:
例如:
1
a/ \b 只有左右孩子的就是概率a、b
c — 3
d / \e 有左右孩子并且有左兄弟 概率分别为 c、d、e
— 5 如果只有左兄弟的话概率为 1
只有以上这三种情况:
如果f(i)表示第i步达到目的地的概率的话
结果ans = f(1)*1 + f(2)*2 + f(3)*3 + ....+f(n)*n
【code】:
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 double dp[100][50][50]; 7 int main() 8 { 9 int n; 10 while(~scanf("%d",&n)&&n) 11 { 12 double a,b,c,d,e; 13 scanf("%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e); 14 memset(dp,0,sizeof(dp)); 15 dp[0][1][1] = 1; 16 int i,j,k; 17 for(k=1;k<=(n-1)*2;k++) 18 { 19 for(i=1;i<=n;i++) 20 { 21 for(j=1;j<=i;j++) 22 { 23 if(j-1<1&&i+1<=n&&j+1<=n) 24 { 25 dp[k][i+1][j] += dp[k-1][i][j]*a; 26 dp[k][i+1][j+1] += dp[k-1][i][j]*b; 27 } 28 else if(j-1>=1&&i+1<=n&&j+1<=n) 29 { 30 dp[k][i][j-1] += dp[k-1][i][j]*e; 31 dp[k][i+1][j] += dp[k-1][i][j]*c; 32 dp[k][i+1][j+1] += dp[k-1][i][j]*d; 33 } 34 else if(j-1>=1&&i==n) 35 { 36 dp[k][i][j-1] += dp[k-1][i][j]; 37 } 38 } 39 } 40 } 41 double res = 0; 42 for(i=1;i<=2*(n-1);i++) 43 { 44 res+=dp[i][n][1]*i; 45 } 46 printf("%.2lf\n",res); 47 } 48 return 0; 49 }
三、第A题,向量旋转
A - Problem A:Rescue The Princess
【题解】:
给你平面上两个点A、B求点C,是的A、B、C逆时针成等边三角形
向量的旋转:
【code1】:
1 #include <iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 6 double xx1,yy1,xx2,yy2; 7 8 int main() 9 { 10 int T; 11 scanf("%d",&T); 12 while (T--) 13 { 14 scanf("%lf%lf%lf%lf",&xx1,&yy1,&xx2,&yy2); 15 double tx = xx2 - xx1; 16 double ty = yy2 - yy1; 17 18 double x = tx*(1.0/2.0) - ty*(sqrt(3.0)/2.0) + xx1; 19 double y = ty*(1.0/2.0) + tx*(sqrt(3.0)/2.0) + yy1; 20 printf("(%.2lf,%.2lf)\n",x,y); 21 } 22 return 0; 23 }
不会向量旋转,直接解方程方法做:
【code2】:
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cmath> 5 #define exb 1e-6 6 #define PI acos(-1.0) 7 using namespace std; 8 struct node 9 { 10 double x,y; 11 }; 12 13 14 double judge(node a ,node b) 15 { 16 return (a.x*b.y-a.y*b.x); 17 } 18 19 double dist(double x1,double y1,double x2,double y2) 20 { 21 return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); 22 } 23 24 int main() 25 { 26 int t; 27 scanf("%d",&t); 28 while(t--) 29 { 30 double x1,y1,x2,y2; 31 scanf("%lf%lf%lf%lf",&x1,&y1,&x2,&y2); 32 double xx=(x1+x2)/2.0; 33 double yy=(y1+y2)/2.0; 34 double dd=dist(x1,y1,x2,y2); 35 if(fabs(y1-y2)<exb) 36 { 37 double yy1=y1+dd*sin(PI/3.0); 38 double yy2=y1-dd*sin(PI/3.0); 39 node ab,ac; 40 ab.x=x2-x1; 41 ab.y=y2-y1; 42 ac.x=xx-x1; 43 ac.y=yy1-y1; 44 45 if(judge(ab,ac)>0) 46 { 47 printf("(%.2f,%.2f)\n",xx,yy1); 48 } 49 else 50 { 51 printf("(%.2f,%.2f)\n",xx,yy2); 52 } 53 } 54 else 55 { 56 if(fabs(x1-x2)<exb) 57 { 58 double xx1=x1+dd*sin(PI/3.0); 59 double xx2=x1-dd*sin(PI/3.0); 60 node ab,ac; 61 ab.x=x2-x1; 62 ab.y=y2-y1; 63 ac.x=xx1-x1; 64 ac.y=yy-y1; 65 if(judge(ab,ac)>0) 66 { 67 printf("(%.2f,%.2f)\n",xx1,yy); 68 } 69 else 70 { 71 printf("(%.2f,%.2f)\n",xx2,yy); 72 } 73 } 74 else 75 { 76 double k=-(x1-x2)/(y1-y2); 77 double pp=atan(k); 78 if(pp>PI/2.0) 79 pp=PI-pp; 80 k=tan(pp); 81 double b=yy-(k*xx); 82 double dd1=dd*sin(PI/3.0); 83 double xx1=sqrt(dd1*dd1/(k*k+1.0)); 84 double yy1=k*xx1; 85 double xx2=-sqrt(dd1*dd1/(k*k+1.0)); 86 double yy2=k*xx2; 87 node ab,ac; 88 ab.x=x2-x1; 89 ab.y=y2-y1; 90 ac.x=xx+xx1-x1; 91 ac.y=yy+yy1-y1; 92 if(judge(ab,ac)>0) 93 { 94 printf("(%.2f,%.2f)\n",xx+xx1,yy+yy1); 95 } 96 else 97 printf("(%.2f,%.2f)\n",xx+xx2,yy+yy2); 98 } 99 } 100 } 101 return 0; 102 }
四、第B题,听说可以暴力BFS过,我们队用的 强连通分量+缩点重构图+拓扑排序
Problem B:Thrall’s Dream