2015年省赛组队选拔赛3

Fast Typing

概率DP 求期望,期望一般要逆推dp[i]代表已经正确打完前i个字符并且正确打完剩下的所有字母的期望,so dp[n] = 0,我们要求dp[0],题目让我们求最小,最小是因为他可以打不定字母再

去检测,具体多少不知道,对于dp[i],枚举j代表打了j个字母然后去检查,在枚举k,代表敲的j个字母,第k个是错误的,so对于不同的j,设敲了几个字母再去检查的期望为bj,

则dp[i] = min(b[j]),

其中bj = t+time // t是检查的时间,time是写这j个字符的时间,用前缀和即可

a[i+1]*(dp[i]+j*ts) // 第一个纠错了,因为是敲了j个再去检查,所以按删除键j次,然后就回到了正确打完前i个字符的情况

(1-a[i+1])*(a[i+2])*(dp[i+1]+(j-1)*ts) //第二个错了,回退j-1次,然后就回到了正确打完前i+1个字符的情况

....

(1-a[i+1])*....*(1-a[i+j])*(dp[i+j]) // j个字符全对了

注意等式左右都有dp[i],移项,在除一下就行了

by fd

 1
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 double dp[111], a[111], b[111];
 7 int main()
 8 {
 9     int n;
10     double t, ts;
11     while(scanf("%d %lf %lf", &n, &t, &ts) != EOF)
12     {
13         for(int i = 1; i <= n; i++)
14             scanf("%lf", &a[i]);
15         for(int i = 1; i <= n; i++)
16         {
17             scanf("%lf", &b[i]);
18             b[i] += b[i-1];
19         }
20         memset(dp, 0, sizeof(dp));
21         for(int i = n-1; i >= 0; i--)
22         {
23             dp[i] = -1;
24             for(int j = 1; j+i <= n; j++)
25             {
26                 double tmp = b[i+j]-b[i]+t+a[i+1]*ts*(j);
27                 double tmp2 = 1;
28                 for(int k = 1; k <= j+1; k++)
29                 {
30                     if(k > 1)
31                     {
32                         if(k == j+1)
33                             tmp += tmp2*(dp[i+k-1]+ts*(j-k+1));
34                         else
35                             tmp += tmp2*a[i+k]*(dp[i+k-1]+ts*(j-k+1));
36                     }
37                     tmp2 *= (1-a[i+k]);
38                 }
39                 if(dp[i] < 0)
40                     dp[i] = tmp/(1-a[i+1]);
41                 else
42                     dp[i] = min(dp[i], tmp/(1-a[i+1]));
43             }
44         }
45         printf("%.2lf\n", dp[0]);
46     }
47     return 0;
48 }

How Many Ways?

组合数+容斥 看到k很小就要往那里想,首先没有障碍物答案就是C(n+m, n)或C(n+m, m),然后减去不符合的,减去经过一个障碍物的,比如是x,y,那么相当于从0,0到x,y再从x,y到n,m。

然后加上经过2个障碍物的,减去经过3个障碍物的。。。。

by fd

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <algorithm>
  4 using namespace std;
  5 typedef __int64 LL;
  6 const LL mod = 19992010;
  7 struct node
  8 {
  9     int x, y;
 10 }p[12];
 11 int n, m, k;
 12 LL prime[2111], vis[2111], c;
 13 LL pow_mod(LL a, LL b)
 14 {
 15     LL ans = 1;
 16     while(b)
 17     {
 18         if(b&1)
 19         {
 20             ans *= a;
 21             ans %= mod;
 22         }
 23         b >>= 1;
 24         a *= a;
 25         a %= mod;
 26     }
 27     return ans;
 28 }
 29 void init()
 30 {
 31     c = 0;
 32     for(int i = 2; i <= 2000; i++)
 33     {
 34         if(!vis[i])
 35         {
 36             prime[c++] = i;
 37             for(int j = i*2; j <= 2000; j += i)
 38                 vis[j] = 1;
 39         }
 40     }
 41 }
 42 LL getnum(LL n, LL p)
 43 {
 44     LL sum = 0;
 45     while(n)
 46     {
 47         sum += n/p;
 48         n /= p;
 49     }
 50     return sum;
 51 }
 52 LL C(LL n, LL m)
 53 {
 54     LL ans = 1;
 55     /*for(int i = 1; i <= m; i++)
 56     {
 57         ans *= (n-i+1);
 58         ans /= i;
 59     }
 60     printf("***%I64d %I64d %I64d ", n, m, ans);
 61     ans = 1;
 62     */
 63     for(int i = 0; i < c && prime[i] <= n; i++)
 64     {
 65         LL x = getnum(n, prime[i]);
 66         LL y = getnum(n-m, prime[i]);
 67         LL z = getnum(m, prime[i]);
 68         ans *= pow_mod(prime[i], x-y-z);
 69         ans %= mod;
 70     }
 71     return ans;
 72 }
 73
 74 bool cmp(node a, node b)
 75 {
 76     if(a.x != b.x)
 77         return a.x < b.x;
 78     return a.y < b.y;
 79 }
 80
 81 void dfs(int i, int j, LL num, LL& ans, int cnt)
 82 {
 83     if(i == k+1)
 84     {
 85         if(cnt)
 86         {
 87             if(cnt&1)
 88             {
 89                 ans -= num*C(p[i].x-p[j].x+p[i].y-p[j].y, p[i].x-p[j].x)%mod;
 90                 if(ans < 0)
 91                     ans += mod;
 92             }
 93             else
 94             {
 95                 ans += num*C(p[i].x-p[j].x+p[i].y-p[j].y, p[i].x-p[j].x)%mod;
 96                 ans %= mod;
 97                 if(ans < 0)
 98                     ans += mod;
 99             }
100         }
101         return;
102     }
103     if(p[i].x >= p[j].x && p[i].y >= p[j].y)
104     {
105         LL tmp = C(p[i].x-p[j].x+p[i].y-p[j].y, p[i].x-p[j].x)*num%mod;
106         dfs(i+1, i, tmp, ans, cnt+1);
107     }
108     dfs(i+1, j, num, ans, cnt);
109 }
110 int main()
111 {
112     init();
113     int T;
114     scanf("%d", &T);
115     while(T--)
116     {
117
118         scanf("%d %d %d", &n, &m, &k);
119         for(int i = 1; i <= k; i++)
120         {
121             scanf("%d %d", &p[i].x, &p[i].y);
122         }
123         sort(p, p+k+1, cmp);
124         p[0].x = 0;
125         p[0].y = 0;
126         p[k+1].x = n;
127         p[k+1].y = m;
128         LL ans = C(n+m, n);
129         dfs(1, 0, 1, ans, 0);
130         printf("%I64d\n", ans);
131     }
132     return 0;
133 }
134 /*
135 5
136 1000 1000 5
137 1 1
138 2 2
139 5 5
140 100 100
141 98 555
142
143 1000 1000 4
144 1 1
145 5 5
146 100 100
147 98 555
148 */

Mine Sweeping

枚举 DP当然可以搞,后来想到一中简单方法,枚举前2个位置有没有地雷,然后检测是否可行,答案最多4中,因为前面2个位置确定了,下面第二个位置雷的数量等于上面3个位置雷的数量之和,即x1+x2+x3 = y2,x1,x2是枚举的已经确定了,所以x3也确定了,然后x2和x3和y3推x4,推到最后,有矛盾退出。。

by fd

时间: 2024-10-21 19:32:45

2015年省赛组队选拔赛3的相关文章

2015年省赛组队选拔赛2

Arc and Point(待补) 几何 Block Toy 神奇的状态压缩DP,在uva上已ac,只给出代码,具体的找本人 http://acm.hust.edu.cn/vjudge/problem/viewSource.action?id=3516028 by fd Kick the ball! 概率题,数据量小,DP搜索都可以,搜索的话深度10,递归当前罚球的是进球还是不进球,复杂度2^10,每次判断是否有必要再比下去,没有必要或者结束,并且比分是要求的答案加上概率 http://acm.

2015北京网络赛A题The Cats&#39; Feeding Spots

题意:给你一百个点,找个以这些点为中心的最小的圆,使得这个圆恰好包含了n个点,而且这个圆的边界上并没有点 解题思路:暴力枚举每个点,求出每个点到其他点的距离,取第n大的点,判断一下. 1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 #include<iostream> 5 #include<memory.h> 6 using namespace std; 7 const i

2015北京网络赛 Couple Trees 倍增算法

2015北京网络赛 Couple Trees 题意:两棵树,求不同树上两个节点的最近公共祖先 思路:比赛时看过的队伍不是很多,没有仔细想.今天补题才发现有个 倍增算法,自己竟然不知道.  解法来自 qscqesze ,这个其实之前如果了解过倍增的话还是不是很难,不过这题的数据也不是很给力,极限数据理论上是过不了的.  其他解法有树链剖分?并不是很清楚.就这样水过了吧... 1 #include <iostream> 2 #include <cstdio> 3 #include &l

2015沈阳网络赛1003 Minimum Cut 树链剖分 数组维护前缀和进行区间增减

2015沈阳网络赛1003  Minimum Cut   树链剖分 数组维护前缀和进行区间增减 Minimum Cut Time Limit: 3000/2000 MS (Java/Others)    Memory Limit: 65535/102400 K (Java/Others)Total Submission(s): 0    Accepted Submission(s): 0 Problem Description Given a simple unweighted graph G 

2015北京网络赛 D-The Celebration of Rabbits 动归+FWT

2015北京网络赛 D-The Celebration of Rabbits 题意: 给定四个正整数n, m, L, R (1≤n,m,L,R≤1000). 设a为一个长度为2n+1的序列. 设f(x)为满足x≤ai≤m+x且ai的异或和为0 的序列a的个数. 求 ∑Rx=Lf(x)mod1000000007 思路:因为对于每一个第一次分配后的a序列对应唯一的x,所以我们就枚举x然后在求序列的个数.

HDU2010省赛集训队选拔赛(校内赛) H

#define is unsafe Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 287    Accepted Submission(s): 178 Problem Description Have you used #define in C/C++ code like the code below? #include <stdio

HDU2010省赛集训队选拔赛(校内赛) G

lazy gege Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 948    Accepted Submission(s): 361 Problem Description Gege hasn't tidied his desk for long,now his desk is full of things. This mornin

2015北京区域赛 Xiongnu&#39;s Land

Wei Qing (died 106 BC) was a military general of the Western Han dynasty whose campaigns against the Xiongnu earned him great acclaim. He was a relative of Emperor Wu because he was the younger half-brother of Empress Wei Zifu (Emperor Wu's wife) and

2015年省赛总结

<"绝地反击"之后的反思> 第一次参加省赛,感受非常深刻! 学校派的的队伍有13支,跟其他高校比较,应该属于派的比较多的高校, ps:由于队伍是打星号去参赛,属于友情参赛,正式到现场发现座位上的队伍名称搞错了,我们就将错就错,干脆把正式队的名字"绝地反击"当作队伍的名字了 先说一下热身赛吧,比赛前.就商量了对策,我负责主敲,队友cb和ljf负责看题,发下题目后,立刻发现A题是道表达式求值的题,需要字符串处理,ljf看来一遍,说他之前在oj做过类似的题,于