寒假训练3解题报告 CodeForces #148

CodeForces 148B

一道简单模拟,判断龙能够抓到公主几次,如果公主和龙同时到达公主的城堡,不算龙抓住她,因为路程除以速度可能会产生浮点数,所以这里考虑一下精度问题

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <iomanip>
 5 #include <algorithm>
 6 using namespace std;
 7 #define eps 1e-19
 8
 9 int ok(int x)
10 {
11     if(abs(x)<=eps) return 0;
12     else return x>0?1:-1;
13 }
14
15 int main()
16 {
17    // freopen("a.in" , "r", stdin);
18     double vp , vd , t , f , c;
19     while(~scanf("%lf%lf%lf%lf%lf", &vp , &vd , &t , &f , &c))
20     {
21         if(ok(vp-vd) >= 0){
22             puts("0");
23             continue;
24         }
25         double  del = t*vp;
26         double cur = del;
27         int ans = 0;
28         double t1 , t2;//t1princess从dragon在cave时到达目的地要的时间,t2表示dragon从cave追上princess要的时间
29         t1 = (c-cur)/vp , t2 = (del)/(vd-vp);
30         while(ok(t1-t2) > 0){
31             cur += t2*vp;
32             cur = cur+(cur/vd+f)*vp;
33             del = cur;
34             t1 = (c-cur)/vp , t2 = (del)/(vd-vp);
35             ans++;
36         }
37         printf("%d\n" , ans);
38     }
39     return 0;
40 }

CodeForces 148C

得到a个数,这些数都比先前的数大但不能比前面所有数的和大,得到b个数这些数都比前面的所有数大

这道题自己写的有点坑,太长了,但其实没那么麻烦

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 int num[105];
 6
 7 int main()
 8 {
 9    // freopen("a.in" , "r", stdin);
10     int n,a,b,sum;
11     while(~scanf("%d%d%d" , &n , &a , &b))
12     {
13         int flag = 1;
14
15         if(a+b+1 == n){
16             num[1] = 1 , sum = 1;
17             if(b == 0 && a>0) flag = 0;
18             for(int i=2 ; i<=1+b ; i++)
19             {
20                 num[i] = sum+1 , sum += num[i];
21                 if(num[i]>=50000){
22                     flag=0;
23                     break;
24                 }
25             }
26             for(int i=2+b ; i<=n ; i++){
27                 num[i] = num[i-1]+1 , sum += num[i];
28                 if(num[i]>=50000){
29                     flag=0;
30                     break;
31                 }
32             }
33
34         }
35         else{
36             sum = 0;
37             num[1] = 1 , sum = 1;
38             if(b>0){
39                 for(int i=2 ; i<=1+b ; i++)
40                 {
41                     num[i] = sum+1 , sum+=num[i];
42                     if(num[i]>=50000){
43                         flag=0;
44                         break;
45                     }
46                 }
47                 for(int i=2+b ; i<=1+a+b ; i++)
48                 {
49                     num[i] = num[i-1]+1;
50                     if(num[i]>=50000){
51                         flag=0;
52                         break;
53                     }
54                 }
55                 for(int i=2+a+b ; i<=n ; i++)
56                     num[i] = num[i-1];
57             }
58             else{
59                 for(int i=1 ; i<=n-a ; i++)
60                     num[i] = 1;
61                 for(int i=n-a+1 ; i<=n ; i++)
62                     num[i] = num[i-1]+1;
63             }
64         }
65         if(!flag){
66             puts("-1");
67             continue;
68         }
69         for(int i=1 ; i<=n ; i++){
70             if(i==1) printf("%d" , num[i]);
71             else printf(" %d" , num[i]);
72         }
73         puts("");
74     }
75     return 0;
76 }

Codeforces 148D

简单的概率dp过程

用dp[0][w][b]表示后取完后游戏还未结束得到w只老鼠,b只黑鼠的概率

用dp[1][w][b]表示龙取完后游戏还未结束得到w只白鼠,b只黑鼠的概率

最后答案就是所有龙取完后游戏未结束的局面*一个后取到白鼠的概率

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 using namespace std;
 5 const int N = 1005;
 6 double dp[2][N][N];
 7
 8 int main()
 9 {
10    // freopen("a.in" , "r", stdin);
11     int w , b;
12     while(~scanf("%d%d" , &w , &b))
13     {
14         memset(dp , 0 , sizeof(dp));
15         dp[1][w][b] = 1.0;
16         for(int i=w ; i>=1 ; i--){
17             for(int j=b ; j>=0 ; j--){
18                 dp[0][i][j] += dp[1][i][j+1]*(j+1)/(i+j+1);
19                 dp[1][i][j] += dp[0][i][j+2]*(j+2)/(i+j+2)*(j+1)/(i+j+1) + dp[0][i+1][j+1]*(j+1)/(i+j+2)*(i+1)/(i+j+1);
20             }
21         }
22         double ans = 0;
23         for(int i=1 ; i<=w ; i++)
24             for(int j=0 ; j<=b ; j++){
25                 ans += dp[1][i][j]*i/(i+j);
26             }
27         printf("%.10f\n" , ans);
28     }
29     return 0;
30 }

codeforces 148E
每行书都是跟其他行没有直接关系的,求出每行书取得的个数达到的最大值

然后将n行结合在一起当成背包问题看

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 using namespace std;
 5 const int N = 105;
 6 int dp[N][N][N] , val[N][N] , sum[N][N];
 7 int maxn[N][N] , cnt[N];
 8 int bag[N][N*N];
 9
10 int main()
11 {
12   //  freopen("a.in" , "r" , stdin);
13     int n,m;
14     while(scanf("%d%d" , &n , &m) != EOF)
15     {
16         memset(dp , 0 , sizeof(dp));
17         memset(maxn , 0 , sizeof(maxn));
18         memset(sum , 0 , sizeof(sum));
19         for(int i=1 ; i<=n ;i++){
20             scanf("%d" , &cnt[i]);
21             for(int j=1 ; j<=cnt[i] ; j++){
22                 scanf("%d" , &val[i][j]);
23                 sum[i][j] = sum[i][j-1]+val[i][j];
24                 for(int k=1 ; k<=cnt[i] ; k++){
25                     for(int l=1 ; l<=k+1 ; l++){
26                         maxn[i][k] = max(maxn[i][k] , sum[i][cnt[i]]-sum[i][l+cnt[i]-k-1] + sum[i][l-1]);
27                     }
28                 }
29             }
30         }
31         memset(bag , 0 , sizeof(bag));
32         for(int i=1 ; i<=n ; i++){
33             for(int k=0 ; k<=cnt[i] ; k++){
34                 for(int j=0 ; j<=m ; j++){
35                     bag[i][j] = max(bag[i][j] , bag[i-1][j]);
36                     if(j>=k)
37                         bag[i][j] = max(bag[i][j] , bag[i-1][j-k]+maxn[i][k]);
38                 }
39             }
40         }
41         printf("%d\n" , bag[n][m]);
42     }
43     return 0;
44 }
时间: 2024-12-26 01:52:51

寒假训练3解题报告 CodeForces #148的相关文章

寒假训练5解题报告

1.HDU 1114 Piggy Bank 一道简单的背包问题 #include <iostream> #include <cstdio> #include <cstring> using namespace std; #define ll long long const int N = 10005; const int INF = 0x3f3f3f3f; int dp[N]; int main() { // freopen("a.in" , &qu

寒假训练1解题报告

1.CodeForces 92A 给一堆围成圈的小朋友发饼干,小朋友为1~n号,第几号小朋友每次拿多少块饼干,问最后剩多少饼干 #include <iostream> #include <cstdio> using namespace std; int main() { // freopen("a.in" , "r" , stdin); int n , m; while(scanf("%d%d" , &n , &a

寒假训练2解题报告

1.CodeForces 112C 找一种可能满足其所给条件,为了让平方和尽可能大,那么我们总和总是取最大为y,分这个y时,尽可能少分这样得到的平方和才最大,所以其他元素都只分到1,留下一个最大元素,这里注意如果每个都分1不够分,直接表示无答案 #include <iostream> #include <cstring> #include <cstdio> using namespace std; #define ll long long const int N = 1

寒假训练4解题报告

1.        Cosmic Tables 数据量比较大,这里不能直接暴力,用行指针和列指针表示当前行列是原来的第几行第几列 #include <cstdio> #include <cstring> #include <iostream> using namespace std; const int N = 1005; int n ,m , k , row[N] , col[N] , a[N][N]; char s[5] ; int p1 , p2; int mai

ECJTU ACM18级队员寒假训练赛 D题 CodeForces 1033A

#include<stdio.h>#include<queue>#include<string.h>#include<math.h>using namespace std; int n,qx,qy,kx,ky,wx,wy; int dx[8]={-1,-1,-1,0,0,1,1,1}; int dy[8]={1,0,-1,1,-1,1,0,-1}; // 方向数组 bool vis[1010][1010]; //标记数组 struct Node{ int x

CSU-ACM2014暑假集训基础组训练赛(1) 解题报告

•Problem A HDU 4450                 水题,签到题 水题..没啥好说的.给大家签到用的. 1 #include <cstdio> 2 int main(){ 3 int n,a,ans; 4 while(scanf("%d",&n),n){ 5 ans = 0; 6 for(int i = 0;i < n;i++){ 7 scanf("%d",&a); 8 ans += a*a; 9 } 10 pr

Codeforces Round #262 (Div. 2)解题报告

详见:http://robotcator.logdown.com/posts/221514-codeforces-round-262-div-2 1:A. Vasya and Socks   http://codeforces.com/contest/460/problem/A 有n双袜子,每天穿一双然后扔掉,每隔m天买一双新袜子,问最多少天后没有袜子穿.. 简单思维题:以前不注重这方面的训练,结果做了比较久,这种题自己边模拟边想.不过要多考虑trick ```c++ int main(){ i

CSU-ACM暑假集训基础组训练赛(4)解题报告

•Problem A SPOJ SUB_PROB   AC自动机 •题意: 给定一个长为M(M≤100000 )的文本串,和N(N≤1000)个长度不超过2000的模式串,问每个模式串是否在文本串中出现过? •几乎和周一课件上的第一个例题一模一样.. •把文本串丢到AC自动机里面去跑. •注意: •1.可能有两个相同的模式串(略坑吧.) •2.一个模式串可能是另一个模式串的后缀,即如果一个点的fail指针指向的点是一个“危险节点”,那么它本身也是一个“危险节点”. 1 #include <ios

解题报告 之 CodeForces 91B Queue

解题报告 之 CodeForces 91B Queue Description There are n walruses standing in a queue in an airport. They are numbered starting from the queue's tail: the 1-st walrus stands at the end of the queue and the n-th walrus stands at the beginning of the queue.