2019 HDOJ Multi-University Training Contest Stage 7(杭电多校)

应该是最毒瘤的一场多校。

题目链接:http://acm.hdu.edu.cn/contests/contest_show.php?cid=854


A:

F:

有n个问题,每道问题的分数取值范围是[0,m],所有分数加起来等于m。每道题知识点无关联,若要解决分数为x的题,则需复习对应知识点x+1个小时。问:解决k道题所需最少复习时间。

可以反向思考这个问题:若出卷老师知道学生每道题的复习时间,怎样出卷才能使得学生做不出k题。

很简单,可以让学生做出复习时间最多的k-1道题,然后令学生复习得最少的m-k+1道题都做不出来,让做不出来的题的难度等于学生的复习时间即可。

回到学生视角,要防止这种情况发生,就应该让复习得最少的m-k+1道题的总复习时间大于m,保证这m-k+1道题中一定能做出一题。

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define dou double
 6 #define pb emplace_back
 7 #define mp make_pair
 8 #define sot(a,b) sort(a+1,a+1+b)
 9 #define rep1(i,a,b) for(int i=a;i<=b;++i)
10 #define rep0(i,a,b) for(int i=a;i<b;++i)
11 #define eps 1e-8
12 #define int_inf 0x3f3f3f3f
13 #define ll_inf 0x7f7f7f7f7f7f7f7f
14 #define lson (curpos<<1)
15 #define rson (curpos<<1|1)
16 /* namespace */
17 using namespace std;
18 /* header end */
19 
20 int main() {
21     int t; scanf("%d", &t);
22     while (t--) {
23         ll n, m, k; scanf("%lld%lld%lld", &n, &m, &k);
24         // m/(n-k+1)+1是前k-1题复习时间,m+1是第k题复习时间
25         printf("%lld
", (m / (n - k + 1) + 1) * (k - 1) + m + 1);
26     }
27     return 0;
28 }
View Code

J:

一个游戏角色要升级,总共有n级,最低级为1级。给定相邻等级升级成功的概率、代价和失败后变成的等级。给出q次查询,每次查询给定两个等级p和q,输出从p级升到q级的期望代价。

显然满足前缀和性质,递推期望即可。

 1 /* basic header */
 2 #include <bits/stdc++.h>
 3 /* define */
 4 #define ll long long
 5 #define dou double
 6 #define pb emplace_back
 7 #define mp make_pair
 8 #define sot(a,b) sort(a+1,a+1+b)
 9 #define rep1(currLevel,a,b) for(int currLevel=a;currLevel<=b;++currLevel)
10 #define rep0(currLevel,a,b) for(int currLevel=a;currLevel<b;++currLevel)
11 #define eps 1e-8
12 #define int_inf 0x3f3f3f3f
13 #define ll_inf 0x7f7f7f7f7f7f7f7f
14 #define lson (curpos<<1)
15 #define rson (curpos<<1|1)
16 /* namespace */
17 using namespace std;
18 /* header end */
19 
20 const int mod = 1e9 + 7, maxn = 1e6 + 10;
21 int sum[maxn];
22 
23 int qp(ll a, ll n) {
24     ll ret = 1;
25     while (n) {
26         if (n & 1) ret = ret * a % mod;
27         a = a * a % mod;
28         n >>= 1;
29     }
30     return ret;
31 }
32 
33 int main() {
34     int t; scanf("%d", &t);
35     while (t--) {
36         int n, q; scanf("%d%d", &n, &q);
37         rep1(currLevel, 1, n) {
38             int p, q, lostLevel, cost; scanf("%d%d%d%d", &p, &q, &lostLevel, &cost);
39             ll preCost = (sum[currLevel - 1] - sum[lostLevel - 1] + mod) % mod;
40             sum[currLevel] = (preCost + cost) % mod * q % mod * qp(p, mod - 2) % mod; // (preCost+addCost)/(p/q)
41             sum[currLevel] = (sum[currLevel] - preCost + mod) % mod; // -preCost
42             sum[currLevel] = (sum[currLevel - 1] + sum[currLevel]) % mod; // 重新计算前缀和
43         }
44         while (q--) {
45             int l, r; scanf("%d%d", &l, &r);
46             printf("%d
", (sum[r - 1] - sum[l - 1] + mod) % mod);
47         }
48     }
49     return 0;
50 }
View Code
原文地址:https://www.cnblogs.com/JHSeng/p/11341696.html