Kejin Player 期望DP
题意:
初始等级为1,每一级有四个参数 r , s , x , a 。
每一级有一个概率p=r/s花费a的代价升级到下一级,失败可能会倒退到x级
设从 l 到 r 的期望为 g(l, r), 这种期望满足减法 g(l, r) = g(1, r) − g(1, l).
因为升级只能一级一 级升, 所以要从 1 升级到 r, 必然要经过 l.
求一个前缀和
sum[i+1]=sum[i]+ai * si / ri + (sum[i]-sum[x])*(si-ri)/ri;
ai * si / ri + (sum[i]-sum[x])*(si-ri)/ri 这个类似于二项分布
一个是升到下一级的花费,一个是失败后回到 i 这一级的花费
1 #include <set> 2 #include <map> 3 #include <stack> 4 #include <queue> 5 #include <cmath> 6 #include <cstdio> 7 #include <string> 8 #include <vector> 9 #include <time.h> 10 #include <cstring> 11 #include <iostream> 12 #include <algorithm> 13 #include <unordered_map> 14 15 16 #define pi acos(-1.0) 17 #define eps 1e-9 18 #define fi first 19 #define se second 20 #define rtl rt<<1 21 #define rtr rt<<1|1 22 #define bug printf("******\n") 23 #define mem(a, b) memset(a,b,sizeof(a)) 24 #define name2str(x) #x 25 #define fuck(x) cout<<#x" = "<<x<<endl 26 #define sf(n) scanf("%d", &n) 27 #define sff(a, b) scanf("%d %d", &a, &b) 28 #define sfff(a, b, c) scanf("%d %d %d", &a, &b, &c) 29 #define sffff(a, b, c, d) scanf("%d %d %d %d", &a, &b, &c, &d) 30 #define pf printf 31 #define FIN freopen("../date.txt","r",stdin) 32 #define gcd(a, b) __gcd(a,b) 33 #define lowbit(x) x&-x 34 #define IO iOS::sync_with_stdio(false) 35 36 37 using namespace std; 38 typedef long long LL; 39 typedef unsigned long long ULL; 40 const int maxn = 1e6 + 7; 41 const int maxm = 8e6 + 10; 42 const int INF = 0x3f3f3f3f; 43 const int mod = 1e9 + 7; 44 45 LL expmod(LL a, LL b) { 46 LL res = 1; 47 while (b) { 48 if (b & 1) res = res * a % mod; 49 a = a * a % mod; 50 b = b >> 1; 51 } 52 return res; 53 } 54 55 56 int t, n, q; 57 struct node { 58 LL r, s, x, a; 59 } qu[maxn]; 60 LL sum[maxn]; 61 62 int main() { 63 //FIN; 64 sf(t); 65 while (t--) { 66 sff(n, q); 67 for (int i = 1; i <= n; i++) scanf("%lld%lld%lld%lld", &qu[i].r, &qu[i].s, &qu[i].x, &qu[i].a); 68 sum[1] = 0; 69 for (int i = 1; i <= n; i++) { 70 sum[i + 1] = sum[i] + qu[i].s * expmod(qu[i].r, mod - 2) % mod * qu[i].a % mod + 71 (qu[i].s - qu[i].r + mod) % mod * expmod(qu[i].r, mod - 2) % mod * 72 (sum[i] - sum[qu[i].x] + mod) % mod; 73 // printf("sum[%d] = %d\n", i + 1, sum[i + 1]); 74 sum[i+1]%=mod; 75 } 76 while (q--) { 77 int L, R; 78 sff(L, R); 79 printf("%lld\n", (sum[R] - sum[L]+mod)%mod); 80 } 81 } 82 return 0; 83 }
Final Exam 思维题
题意:
有n个题目,每个题目的分数总和为m,你不知道哪个题目的分数是多少。
一个题目的分数是X,则你最少需要X+1的时间才能做出这一个问题。
每一题的分数范围都是【0,m】
问你保证回答出k个问题的最小代价是多少。
因为每一题的分数未知,你无法知道前K个问题的最小代价和。
考虑极端情况,假设你要问答K个问题,有K-1的都是0分,剩下的问题总分是m分,
如何保证一定可以回答出K个问题呢
那就是对于剩下的n-k+1个问题都复习m/(n-k+1)+1小时,
其实就是你保证你剩下的n-k+1的问题复习m小时以上(这样你这个n-k+1个问题里面你至少可以做出来一个)
这个可以保证这n个问题无论你选哪一个都有K个你做的出。
完全不会分析,流下了菜鸡的眼泪。
1 #include <bits/stdc++.h> 2 #include <cstdio> 3 #include <cstring> 4 #include <queue> 5 #include <cmath> 6 #include <algorithm> 7 #include <set> 8 #include <iostream> 9 #include <map> 10 #include <stack> 11 #include <string> 12 #include <time.h> 13 #include <vector> 14 15 #define pi acos(-1.0) 16 #define eps 1e-9 17 #define fi first 18 #define se second 19 #define rtl rt<<1 20 #define rtr rt<<1|1 21 #define bug printf("******\n") 22 #define mem(a, b) memset(a,b,sizeof(a)) 23 #define name2str(x) #x 24 #define fuck(x) cout<<#x" = "<<x<<endl 25 #define sf(n) scanf("%d", &n) 26 #define sff(a, b) scanf("%d %d", &a, &b) 27 #define sfff(a, b, c) scanf("%d %d %d", &a, &b, &c) 28 #define sffff(a, b, c, d) scanf("%d %d %d %d", &a, &b, &c, &d) 29 #define pf printf 30 #define FRE(i, a, b) for(i = a; i <= b; i++) 31 #define FREE(i, a, b) for(i = a; i >= b; i--) 32 #define FRL(i, a, b) for(i = a; i < b; i++)+ 33 #define FRLL(i, a, b) for(i = a; i > b; i--) 34 #define FIN freopen("../date.txt","r",stdin) 35 #define gcd(a, b) __gcd(a,b) 36 #define lowbit(x) x&-x 37 #define rep(i, a, b) for(int i=a;i<b;++i) 38 #define per(i, a, b) for(int i=a-1;i>=b;--i) 39 40 using namespace std; 41 typedef long long LL; 42 typedef unsigned long long ULL; 43 const int maxn = 3e3 + 7; 44 const int maxm = 8e6 + 10; 45 const int INF = 0x3f3f3f3f; 46 const int mod = 10007; 47 48 49 int t; 50 LL n, m, k; 51 52 int main() { 53 sf(t); 54 while (t--) { 55 scanf("%lld%lld%lld", &n, &m, &k); 56 printf("%lld\n", m + k + (k - 1) * (m / (n - k + 1))); 57 } 58 return 0; 59 }
原文地址:https://www.cnblogs.com/qldabiaoge/p/11343283.html
时间: 2024-10-04 07:35:18