2019暑假多校训练第七场 | 部分题解

这一次是华东师范大学出的题目

出题人说 一不小心出成了 没人AC数量最多的一场多校

我最开始看的就是E题 想了好久 以为自己找到规律了 (其实并没有)到比赛结束也没人A这题

靠川酱carry全场

题解链接:https://pan.baidu.com/s/14ccQThGuG_AsXUZgoA739Q 提取码: xy5c 复制这段内容后打开百度网盘手机App,操作更方便哦

 

06 Final Exam

HDU 6651 思维题

大意:一共有n道题目,总分为m,学生为了得到x分的成绩需要学习x+1小时,他需要对k道题目,求他最少复习多少时间。

不知道每道题目对应的分值,可以先假设,k-1道题目的分数都是 0 分,

那么他需要再对一道题目就可以了

用 m+1 的时间复习 (n-k+1)道题目,其中每道题目的复习时间为(m+1)/(n-k+1)

剩下的 k-1 题所用的时间必须比(n-k+1)所需的时间多 所以是(m+1)/(n-k+1)*(k-1)

还有一题的分值必须比 m 分多 所以需要(m+1)

参考:https://blog.csdn.net/qq_43316231/article/details/99320860#commentBox

#include 
#include 
using namespace std;
int mod = 1e9 + 7;
#define ll long long
int main()
{
    int t;
    scanf("%d", &t);
    ll n, m, k;
    while (t--) {
        scanf("%lld%lld%lld", &n, &m, &k);
        ll p = (m + 1) / (n - k + 1);
        if ((m + 1) % (n - k + 1) > 0) {
            p = p + 1;
        }
        ll ans = p * (k - 1) + m + 1;
        printf("%lld\n", ans);
    }
    return 0;
}

 

11 Kejin Player

HDU 6656 期望dp/概率dp

题目大意:对于每一个等级,可以花 ai 元,有 ri/si 概率升级,如果升级失败就退到xi级,问从 L 级升到 R 级的钱数期望

每一级都有成功和失败两种可能

需要判断在 i 级升级失败时退到 xi 级时 需要多少再回到 i 级

得到下列式子

dp\left [ \, i\, \right ] = \frac{r_{i-1}}{s_{i-1}}*\left (dp\left [ \, i-1\, \right ] +a_{i-1}\right ) + (1-\, \frac{r_{i-1}}{s_{i-1}})*\left (dp\left [ \, i-1\, \right ] +a_{i-1}+dp\left [ \, i\, \right ] - dp\left [x _{i-1} \right ]\right )

左右两边化简 可得

 dp\left [\, i \, \right ] =\left ( dp\left [ i-1 \right ] +a_{i-1} -dp\left [ x_{i-1} \right ]\right ) * \frac{s_{i-1}}{r_{i-1}}+dp\left [ x_{i-1} \right ]

代码如下:

#include 
#include 
using namespace std;
int mod = 1e9 + 7;
#define ll long long
ll dp[1000005];
ll quickpow(ll x, ll n)
{
    ll res = x;
    ll ans = 1;
    while (n) {
        if (n & 1) {
            ans = (ans % mod) * (res % mod) % mod;
        }
        res = (res % mod) * (res % mod);
        n = n >> 1;
    }
    return ans;
}
int main()
{
    int t;
    int n, m, L, R;
    ll r, s, x, a, p, q;
    scanf("%d", &t);
    while (t--) {
        memset(dp, 0, sizeof dp);
        scanf("%d%d", &n, &m);
        dp[0] = 0;
        for (int i = 1; i <= n; i++) {
            scanf("%lld%lld%lld%lld", &r, &s, &x, &a);
            q = (s % mod * quickpow(r, mod - 2) % mod) % mod;
            dp[i] = ((dp[i - 1] + a) % mod - dp[x - 1] + mod) % mod;
            dp[i] = (dp[i] * (q % mod) % mod + mod + dp[x - 1]) % mod;
        }
        for (int i = 0; i < m; i++) {
            scanf("%d%d", &L, &R);
            printf("%lld\n", (dp[R - 1] + mod - dp[L - 1]) % mod);
        }
    }
    return 0;
}

PS:要注意加减的时候要先加上模数在取模

 

10 Just Repeat

HDU 6655 贪心思想/博弈

后来写了题解:https://blog.csdn.net/OneLine_/article/details/99684656

 

01 

HDU 6646 暴力判断

 

 

你可能感兴趣的:(比赛周记)