题解 | #Messages#

Messages

https://ac.nowcoder.com/acm/contest/32282/G

【Messages】

定义X=inxiX=\sum_{i}^nx_i读到需要的信息的学生的数量,其中xix_i为第ii个学生是否读到自己需要的信息,如果读到就为11,否则为00

根据期望的可加性可知:

E(X)=E(x1)+E(x2)+..+E(xn)\mathbb{E}(X)=\mathbb{E}(x_1)+\mathbb{E}(x_2)+..+\mathbb{E}(x_n)

对于每一个E(xi)\mathbb{E}(x_i)来说:

E(xi)=1P(imi)+0P(imi)=1P(imi)=Pi\begin{matrix} \mathbb{E}(x_i)&=&1\cdot P(第i个学生读到m_i)+0\cdot P(第i个学生没有读到m_i) \\ \\ &=&1\cdot P(第i个学生读到m_i) \\ \\ &=&P_i \end{matrix}

故:

E(X)=i=1nE(xi)=i=1nPi\mathbb{E}(X)=\sum_{i=1}^n\mathbb{E}(x_i)=\sum_{i=1}^nP_i

若顶置的消息集合为: U=<u1,u2,...,ut>U=<u_1,u_2,...,u_t>,则:

Pi={0,miU1,miUtkikit,miUt>kiP_i= \begin{cases} 0, & 如果m_i\notin U \\ 1, & 如果m_i\in U且t\le k_i \\ \frac{k_i}{t}, & 如果m_i\in U且t> k_i \end{cases}

因为我们要选取一个集合UU使得期望E(X)\mathbb{E}(X)最大,所以当tt固定时,我们可以贪心的选取集合UU

又因1ki201\le k_i\le 20,故当nt>20n\ge t> 20时,Pi=kitP_i=\frac{k_i}{t}

E(X)=i=1nPi=i=1nkit=1ti=1nki\mathbb{E}(X)=\sum_{i=1}^nP_i=\sum_{i=1}^n\frac{k_i}{t}=\frac{1}{t}\sum_{i=1}^nk_i

需要先将kik_i的值排序并做前缀和,然后再枚举tt的值。

t20t\le 20时,可以暴力枚举。

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, m[N], k[N];

double f(int t) {  // 固定t时的最优选取
    unordered_map<int, double> val;
    for (int i = 1; i <= n; i++) {
        if (t <= k[i])
            val[m[i]] += 1;
        else
            val[m[i]] += (1.0 * k[i]) / t;
    }
    vector<pair<int, double>> vec;
    for (auto it : val) vec.push_back({it.first, it.second});
    sort(vec.begin(), vec.end(),
         [](auto a, auto b) { return a.second > b.second; });

    double sum = 0;
    for (int i = 0; i < min(t, (int)vec.size()); i++) sum += vec[i].second;
    return sum;
}

void print(int t) {
    unordered_map<int, double> val;
    for (int i = 1; i <= n; i++) {
        if (t <= k[i])
            val[m[i]] += 1;
        else
            val[m[i]] += 1.0 * k[i] / t;
    }
    vector<pair<int, double>> vec;
    for (auto it : val) vec.push_back({it.first, it.second});
    sort(vec.begin(), vec.end(),
         [](auto a, auto b) { return a.second > b.second; });

    cout << t << "\n";
    for (int i = 0; i < t; i++) cout << vec[i].first << " ";
}

double maxn = -1;
int res = -1;
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> m[i] >> k[i];

    // 当1 < t <= 20时
    for (int t = 1; t <= 20; t++) {
        double sum = f(t);
        if (sum > maxn) maxn = sum, res = t;
    }

    // 预处理:排序,前缀和
    unordered_map<int, double> val;
    for (int i = 1; i <= n; i++) val[m[i]] += k[i];
    vector<pair<int, double>> vec;
    for (auto it : val) vec.push_back({it.first, it.second});
    sort(vec.begin(), vec.end(),
         [](auto a, auto b) { return a.second > b.second; });
    for (int i = 1; i < vec.size(); i++) vec[i].second += vec[i - 1].second;

    // 当t > 20时
    for (int t = 21; t <= vec.size(); t++) {
        double tmp = 1.0 * vec[t - 1].second / t;
        if (tmp > maxn) maxn = tmp, res = t;
    }

    print(res); // 输出结果

    return 0;
}
全部评论

相关推荐

2025-12-12 19:01
南京航空航天大学 C++
秋招没咋投,准备&nbsp;wxg&nbsp;转正之后摆烂了。结果不堪字节&nbsp;HR&nbsp;的骚扰还是面了一下字节。之前想去字节的时候怎么面都挂。现在想着随便面一下结果三面技术面都意外顺利还有加面。十月中旬字节发了意向,wxg&nbsp;转正结果无响应。十月底字节拉了保温群,wxg&nbsp;口头通过,系统显示考核中。十一月初和字节&nbsp;ld&nbsp;交流之后得知&nbsp;base&nbsp;居然能选海外,甚至能小&nbsp;wlb&nbsp;一下,wxg&nbsp;无响应无人联系。十一月中旬把字节&nbsp;base&nbsp;转到了海外,wxg&nbsp;流程灰了,一问超时忘处理了,过两天又变考核中了。十一月下旬字节换了海外&nbsp;HR&nbsp;对接,问了期望薪资,wxg&nbsp;考核终于显示通过,无&nbsp;HR&nbsp;保温,无其他保温。十一月底给字节报了个天价,想吓吓他们,同时告诉微信字节要开了,微信无响应。同样十一月底字节&nbsp;HR&nbsp;告诉我确实给不到那么高,但是能拿期权补上,问能不能接受。微信无响应。同样十一月底字节&nbsp;HR&nbsp;告知了具体方案,符合预期。&nbsp;微信无响应。十二月上旬催&nbsp;wxg&nbsp;不开我就盲拒了,wxg&nbsp;HR&nbsp;火急火燎的打电话问情况,问期望。我给了一个不算夸张的总包数字,因为今年市场在涨,过了三天还不联系我,我再催,约时间下午打电话,非得在我给出的数字上压下去几万,微信又不差这点,为什么不能满足我,让我没有拒绝的理由呢?一番纠结抗争,求稳还是追求挑战,最终选择接受迎接新的挑战,因为堂吉诃德永远不会停下脚步!回想起来,在&nbsp;wxg&nbsp;谈薪的阶段,我认为并没有给予我一定的重视,即使&nbsp;HR&nbsp;表示我在实习期间的表现和之前的面评都很靠前。也没有感觉到想要争取我,虽然我表示拒了&nbsp;offer&nbsp;之后要给我加面委定&nbsp;t6&nbsp;再涨,但我三个月没面试让我面面委那就是白给,还是算了。有缘再见了我亲爱的&nbsp;wxg,再见了曾经的梦中情厂,再见亲爱的&nbsp;mt,再见亲爱的朋友们。也再见,北京的一切。我想润了。秋招结束,卸载牛客,下一个三年,下一个五年,下一个十年后再来看看。
面试中的大熊猫爱吃薯...:我嫉妒得狗眼通红
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务