一、第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 }
View Code

二、第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 }
View Code

三、第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 }  
View Code

不会向量旋转,直接解方程方法做:

【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 }
View Code

四、第B题,听说可以暴力BFS过,我们队用的 强连通分量+缩点重构图+拓扑排序

Problem B:Thrall’s Dream

相关文章: