集训的小总结
该死的期末考试终于结束了,又可以有时间肝代码了,尽管还处在等待成绩的焦虑当中,这一天,A了20多道比较简单的题,其中,这几个题给我留下了深刻的印象
题目一:地址 http://www.fjutacm.com/Problem.jsp?pid=1323
刚拿到这个题时,由于备战期末,有半个月都没有碰过这类数学题了,也懒得去想简便的数学方法,就直接暴力模拟跑的过程,由于没有考虑叮当狗跑的速度如果低于人的速度的情况,导致在第一次提交的时候便WA了,修改也花费了不少的时间。当我通过这个题后,看了看别人提交的代码,才意识到,这个题如果有数学方法,是十分简便的。因为人在走的同时,狗也在跑,所以,狗跑的总路程就是两个人相遇所需的时间乘上狗跑的速度,两三行代码就能解决。。。。。。所以,做题时,我们不要一味地蛮干,还是要经过自己的思考。
附上我比较SB的代码
1 #include<stdio.h> 2 #include<bits/stdc++.h> 3 using namespace std; 4 int main() 5 { 6 int time,ii,iii=0; 7 scanf("%d",&time); 8 for (ii=0;ii<time;ii++) 9 { 10 double u,v,w,l; 11 12 scanf("%lf %lf %lf %lf",&u,&v,&w,&l); 13 14 double t=0; 15 int tt=1; 16 double s=l; 17 double ans=0; 18 if (w<u || w<v) 19 { 20 printf("%.3f\n",w*l/(v+u)); 21 continue; 22 } 23 while(t<(l/(u+v))) 24 { 25 double ttt=0; 26 if (tt==1) 27 { 28 ttt=(s/(w+v)); 29 t=t+ttt; 30 s=s-ttt*(v+u); 31 tt=-tt; 32 ans=ans+ttt*w; 33 34 iii++; 35 continue; 36 } 37 if (tt==-1) 38 { 39 ttt=s/(w+u); 40 t=t+ttt; 41 s=s-ttt*(u+v); 42 ans=ans+ttt*w; 43 tt=-tt; 44 45 iii++; 46 } 47 if (iii>5000) 48 { 49 break; 50 } 51 52 } 53 printf("%.3f\n",ans); 54 55 } 56 }
在附上简单的代码
1 #include<stdio.h> 2 int main() 3 { 4 int time,ii,iii=0; 5 scanf("%d",&time); 6 for (ii=0;ii<time;ii++) 7 { 8 double u,v,w,l; 9 10 scanf("%lf %lf %lf %lf",&u,&v,&w,&l); 11 12 printf("%.3f\n",w*l/(v+u)); 13 } 14 }
这差别也太大了吧~~~
题目二:http://www.fjutacm.com/Problem.jsp?pid=1507
这又是一道数学题,这个题也是一个求期望的题。尽管在10月备战天梯赛的时候学过一些有关数学期望的算法,但我并不是很熟练。我的第一反应还是模拟整个过程。但是,在草稿纸上进行到第二步时,我发现可能出现的情况正在成倍增长,如果模拟整个过程,怕是天黑都弄不完。有了上一个题的经验,我放弃了模拟,开始寻找一个简便的数学方法。经过思考,我发现故事的主人公再拿巧克力的时候,每一个巧克力被拿的概率都是相同的,尽管在之后的k分钟的时间里,那块巧克力不能够再一次被拿走,但是,所有巧克力都是这样的,所以,拿走每块巧克力对后续造成的影响也一样。由此:可以得到这个结论:每次拿走巧克力价值的期望是相等的。这个题的答案就是拿的次数乘每次拿的期望值。
附代码:
1 #include<stdio.h> 2 int main() 3 { 4 int t,i,j; 5 scanf("%d",&t); 6 for (i=0;i<t;i++) 7 { 8 double s=0; 9 int c[1010]; 10 int time[1010]; 11 int n,m,k; 12 scanf("%d %d %d",&n,&m,&k); 13 for (j=0;j<n;j++) 14 { 15 scanf("%d",&c[j]); 16 s=s+c[j]; 17 } 18 s=s*m/n; 19 printf("Case %d: %.5f\n",i+1,s); 20 21 } 22 return 0; 23 }
题目三:http://www.fjutacm.com/Problem.jsp?pid=1508
这是一个时钟问题,貌似在小学奥数中就有这一类型的题目,只要能够求出时钟的转动速度与真实时间的差值的比值,通过差值乘上要求的时间,不难得出结果。第三问只要算出再次相同时候的总时间:60*60*12,在通过比值算出每秒两者之间的差值,就能求出再次相同的时间。思维的过程比较绕,想明白了还是简单,附上代码吧:
1 #include<stdio.h> 2 int main() 3 { 4 int t,ii; 5 scanf("%d",&t); 6 for (ii=0;ii<t;ii++) 7 { 8 int x; 9 double ans=0; 10 scanf("%d",&x); 11 int q,i; 12 scanf("%d",&q); 13 for (i=0;i<q;i++) 14 { 15 int a; 16 scanf("%d",&a); 17 if (a==1) 18 { 19 int k; 20 scanf("%d",&k); 21 ans=k*(60-x); 22 } 23 if (a==2) 24 { 25 int k; 26 scanf("%d",&k); 27 ans=k*60*(60.0/(60-x)); 28 29 } 30 if (a==3) 31 { 32 double k; 33 scanf("%lf",&k); 34 double v; 35 v=(double)x/60; 36 ans=43200*k/v; 37 } 38 printf("%.2f\n",ans); 39 } 40 } 41 return 0; 42 }