这一次是华东师范大学出的题目
出题人说 一不小心出成了 没人AC数量最多的一场多校
我最开始看的就是E题 想了好久 以为自己找到规律了 (其实并没有)到比赛结束也没人A这题
靠川酱carry全场
题解链接:https://pan.baidu.com/s/14ccQThGuG_AsXUZgoA739Q 提取码: xy5c 复制这段内容后打开百度网盘手机App,操作更方便哦
大意:一共有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;
}
题目大意:对于每一个等级,可以花 ai 元,有 ri/si 概率升级,如果升级失败就退到xi级,问从 L 级升到 R 级的钱数期望
每一级都有成功和失败两种可能
需要判断在 i 级升级失败时退到 xi 级时 需要多少再回到 i 级
得到下列式子
左右两边化简 可得
代码如下:
#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:要注意加减的时候要先加上模数在取模
后来写了题解:https://blog.csdn.net/OneLine_/article/details/99684656