小美和小团最近沉迷可乐。可供TA们选择的可乐共有k种,比如可口可乐、零度可乐等等,每种可乐会带给小美和小团不同的快乐程度。
TA们一共要买n瓶可乐,每种可乐可以买无限多瓶,小美会随机挑选其中的m瓶喝,剩下的n-m瓶小团喝。
请问应该如何购买可乐,使得小美和小团得到的快乐程度的和的期望值最大?
TA们一共要买n瓶可乐,每种可乐可以买无限多瓶,小美会随机挑选其中的m瓶喝,剩下的n-m瓶小团喝。
请问应该如何购买可乐,使得小美和小团得到的快乐程度的和的期望值最大?
现在请求出购买可乐的方案。
输入描述:
第一行三个整数n,m,k分别表示要买的可乐数、小美喝的可乐数以及可供选择的可乐种数。 接下来k行,每行两个整数a,b分别表示某种可乐分别给予小美和小团的快乐程度。 对于所有数据,1 <= n <= 10,000, 0 <= m <= n, 1 <= k <= 10,000, -10,000 <= a, b <= 10,000
输出描述:
一行k个整数,第i个整数表示购买第i种可乐的数目。 如果有多解,请输出字典序最小的那个。 对于两个序列 a1, a2, ..., ak, b1, b2, ..., bk,a的字典序小于b,当且仅当存在一个位置i <= k满足: ai < bi且对于所有的位置 j < i,aj = bj;
示例1
输入
2 1 2 1 2 3 1
输出
0 2
说明
一共有三种购买方案: 1. 买2瓶第一类可乐,小美和小团各喝一瓶,期望得到的快乐程度和为1+2=3; 2. 买1瓶第一类可乐和1瓶第二类可乐,小美和小团各有二分之一的概率喝到第一类可乐,另有二分之一的概率喝到第二类可乐,期望得到的快乐程度和为1*0.5+3*0.5+2*0.5+1*0.5=3.5; 3. 买2瓶第二类可乐,小美和小团各喝一瓶,期望得到的快乐程度和为3+1=4。
#include <iostream>
#include <vector>
#include <memory.h>
using namespace std;
const int nmax=10001;
int main()
{
int n(0), m(0), k(0);
int res(0);
cin >> n;
cin >> m;
cin >> k;
vector<int> a, b;
int buy[nmax];
memset(buy, 0, sizeof(int)*k);
for (int i = 0; i < k;++i)
{
int temp1(0), temp2(0);
cin >> temp1;
cin >> temp2;
a.push_back(temp1);
b.push_back(temp2);
}
auto cal = [a, b, n, m](int x)-> double
{return a[x] * m + b[x] * (n - m); };
for (int j = 0; j < k; ++j)
{
if (cal(j) >= cal(res))
res = j;
}
buy[res] = n;
for (int i = 0; i < k-1;++i)
{
cout << buy[i] << " ";
}
cout << buy[k-1];
}