2.维克多
維克多博士創(chuàng)造了一個裂變反應(yīng)堆,可取用處于液體狀態(tài)的放射性物質(zhì),反應(yīng)堆的容量是V加侖。他有N瓶的放射性液體,每個都有一定的質(zhì)量和一定的體積。當液體倒入反應(yīng)堆時,也產(chǎn)生一些單位的能量。現(xiàn)在,維克多想要將能量輸出最大化。但是,有一個限制條件。他研究了原子元素的物理知識和歷史,認識到反應(yīng)堆內(nèi)放射性液體的總量不能超過特定的臨界質(zhì)量M,否則反應(yīng)就會失控,并引發(fā)劇烈的爆炸。
寫一個算法,幫助他從反應(yīng)堆獲得最大的能量,而不會讓他丟掉性命。
輸入
該函數(shù)/方法的輸入包括六個參數(shù)——
reactorCap,一個整數(shù),表示反應(yīng)堆的容量(V);
numberOfRadLiquid,一個整數(shù),表示現(xiàn)有小瓶的數(shù)量(N);
criticalMass,一個整數(shù),表示反應(yīng)堆的最大臨界值(M);
volumes,一個整數(shù)列表,按順序表示N份放射性液體的體積;
masses,一個整數(shù)列表,按順序表示N份放射性液體的質(zhì)量;
energies,一個整數(shù)列表,按順序表示N份放射性液體產(chǎn)生的能量。
輸出
返回一個整數(shù),表示可在給定的約束條件下從反應(yīng)堆中產(chǎn)生的最大能量。
約束條件
1≤numberOfRadLiquid≤10^4
示例
輸入:
reactorCap=100
numberOfRadLiquid=5
criticalMass=15
volumes=[50,40,30,20,10]
masses=[1,2,3,9,5]
energies=[300,480,270,200,180]
輸出:
960
解釋:
通過選擇1、2、5號瓶中的液體,產(chǎn)生的能量=300+480+180=960。
這種液體組合產(chǎn)生的總體積=50+40+10=100,不大于reactorCap,造成反應(yīng)堆中的總質(zhì)量=1+2+5=8,不大于criticalMass。
//INCLUDE HEADER FILES NEEDED BY YOUR PROGRAM
//SOME LIBRARY FUNCIONALITY MAY BE RESTRICTED
//DEFINE ANY FUNCTION NEEDED
//FUNCTION SIGNATURE BEGINS,THIS FUNCTION IS REQUIRED
int maxEnergyGenerate(int reactorCap,int numberOfRadLiquid,int criticalMass,int* volumes,int* masses,int* energies)
{
//WRITE YOUR CODE HERE
}
//FUNCTION SIGNATURE ENDS
回答:
李yc版本(用以下代碼覆蓋掉已給代碼)
#include
#include
#include
using namespace std;
// 求排列組合算法: C(n, m): 從n個數(shù)中任選m個數(shù)組成一個新的數(shù), 求有多少種組合, 分別是什么
// 從v[]里任選m個元素組成一個組合, 與順序無關(guān)
template
vector<vector> fun(vector v, int m)
{
if (v.size() < m)
return{}; // 找不到這樣的組合
vector<vector> ret;
if (v.size() == m) // v[]中任選m個數(shù)
{
ret.push_back(v); // 唯一的一個組合
return ret;
}
else if (m == 1) // v[]中任選1個數(shù)
{
for (auto& it : v)
{
ret.push_back(vector {it});
}
return ret;
}
while (v.size() >= m)
{
auto first = v.front();
v.erase(v.begin());
// 在剩下的v[1~]中任選m-1個數(shù)
auto res = fun(v, m - 1);
for (auto& it : res)
{
it.insert(it.begin(), first);
ret.push_back(it);
}
}
return ret;
}
int maxEnergyGenerate(int reactorCap, int numberOfRadLiquid, int criticalMass,
int *volumes, int *masses, int *energies)
{
int sum_energies = 0;
std::vector v = {};//每個瓶子編號
for (int i = 0; i < numberOfRadLiquid; i++)
v.push_back(i + 1);
for (int i = numberOfRadLiquid; i >= 1; i–)
{
auto res = fun(v, i);
int sum_energies_i = 0;
int sum_masses = 0;
int sum_volumes = 0;
for (auto& it : res)
{
sum_volumes = 0;
sum_masses = 0;
sum_energies_i = 0;
for (auto& it2 : it)
{
sum_volumes = volumes[it2 - 1] + sum_volumes;
sum_masses = masses[it2 - 1] + sum_masses;
sum_energies_i = energies[it2 - 1] + sum_energies_i;
}
if (sum_volumes <= reactorCap && sum_masses <= criticalMass && sum_energies_i > sum_energies)
{
sum_energies = sum_energies_i;
}
}
}
return sum_energies;
}
李yc版本:(改掉變量名的)
#include “pch.h”
#include
#include
#include
using namespace std;
// 求排列組合算法: C(n, m): 從n個數(shù)中任選m個數(shù)組成一個新的數(shù), 求有多少種組合, 分別是什么
// 從v[]里任選m個元素組成一個組合, 與順序無關(guān)
template
vector<vector> fun(vector v, int m)
{
if (v.size() < m)
return{}; // 找不到這樣的組合
vector<vector> ret;
if (v.size() == m) // v[]中任選m個數(shù)
{
ret.push_back(v); // 唯一的一個組合
return ret;
}
else if (m == 1) // v[]中任選1個數(shù)
{
for (auto& it : v)
{
ret.push_back(vector {it});
}
return ret;
}
while (v.size() >= m)
{
auto first = v.front();
v.erase(v.begin());
// 在剩下的v[1~]中任選m-1個數(shù)
auto res = fun(v, m - 1);
for (auto& it : res)
{
it.insert(it.begin(), first);
ret.push_back(it);
}
}
return ret;
}
int maxEnergyGenerate(int reactorCap, int numberOfRadLiquid, int criticalMass,
int *volumes, int *masses, int *energies)
{
int sum_energies = 0;
std::vector v = {};//每個瓶子編號
for (int i = 0; i < numberOfRadLiquid; i++)
v.push_back(i + 1);
for (int i = numberOfRadLiquid; i >= 1; i–)
{
auto res = fun(v, i);
int sum_energies_i = 0;
int sum_masses = 0;
int sum_volumes = 0;
for (auto& it : res)
{
sum_volumes = 0;
sum_masses = 0;
sum_energies_i = 0;
for (auto& it2 : it)
{
sum_volumes = volumes[it2 - 1] + sum_volumes;
sum_masses = masses[it2 - 1] + sum_masses;
sum_energies_i = energies[it2 - 1] + sum_energies_i;
}
if (sum_volumes <= reactorCap && sum_masses <= criticalMass && sum_energies_i > sum_energies)
{
sum_energies = sum_energies_i;
}
}
}
return sum_energies;
}
int main()
{
int reactorCap = 250;//容量50
int numberOfRadLiquid = 5;//個數(shù)
int criticalMass = 25;//臨界質(zhì)量
int volumes[5] = { 30, 40, 50, 60, 70 };//體積
int masses[5] = { 7, 8, 9, 10, 11 };//質(zhì)量
int energies[5] = { 300, 400, 500, 600, 700 };//能量
int sum_energies = maxEnergyGenerate(reactorCap, numberOfRadLiquid,criticalMass,
volumes, masses, energies);
cout << sum_energies << endl;
return 0;
}
汪px版本:
#include “pch.h”
#include
#include
#include
using namespace std;
// 求排列組合算法: C(n, m): 從n個數(shù)中任選m個數(shù)組成一個新的數(shù), 求有多少種組合, 分別是什么
// 從v[]里任選m個元素組成一個組合, 與順序無關(guān)
template
vector<vector> fun(vector v, int m)
{
if (v.size() < m)
return{}; // 找不到這樣的組合
vector<vector> ret;
if (v.size() == m) // v[]中任選m個數(shù)
{
ret.push_back(v); // 唯一的一個組合
return ret;
}
else if (m == 1) // v[]中任選1個數(shù)
{
for (auto& it : v)
{
ret.push_back(vector {it});
}
return ret;
}
while (v.size() >= m)
{
auto first = v.front();
v.erase(v.begin());
// 在剩下的v[1~]中任選m-1個數(shù)
auto res = fun(v, m - 1);
for (auto& it : res)
{
it.insert(it.begin(), first);
ret.push_back(it);
}
}
return ret;
}
int maxEnergyGenerate(int reactorCap, int numberOfRadLiquid, int criticalMass,
int *volumes, int *masses, int *energies)
{
int sum_energies = 0;
std::vector v = {};//每個瓶子編號
for (int i = 0; i < numberOfRadLiquid; i++)
v.push_back(i + 1);
for (int i = numberOfRadLiquid; i >= 1; i–)
{
auto res = fun(v, i);
int sum_energies_i = 0;
int sum_masses = 0;
int sum_volumes = 0;
for (auto& it : res)
{
sum_volumes = 0;
sum_masses = 0;
sum_energies_i = 0;
for (auto& it2 : it)
{
sum_volumes = volumes[it2 - 1] + sum_volumes;
sum_masses = masses[it2 - 1] + sum_masses;
sum_energies_i = energies[it2 - 1] + sum_energies_i;
}
if (sum_volumes <= reactorCap && sum_masses <= criticalMass && sum_energies_i > sum_energies)
{
sum_energies = sum_energies_i;
}
}
}
return sum_energies;
}
int main()
{
int reactorCap = 250;//容量50
int numberOfRadLiquid = 5;//個數(shù)
int criticalMass = 25;//臨界質(zhì)量
int volumes[5] = { 30, 40, 50, 60, 70 };//體積
int masses[5] = { 7, 8, 9, 10, 11 };//質(zhì)量
int energies[5] = { 300, 400, 500, 600, 700 };//能量
int sum_energies = maxEnergyGenerate(reactorCap, numberOfRadLiquid,criticalMass,
volumes, masses, energies);
cout << sum_energies << endl;
return 0;
}
黃yx版本:
int maxEnergyGenerate(int reactorCap, int numberOfRadLiquid, int criticalMass, int *volumes, int *masses, int *energies)
{
?float k = reactorCap / criticalMass;
?vector massRate;
?vector volumesRate;
?vector finalRate;
?vector list;
?for (int i = 0; i < numberOfRadLiquid; i++)
?{
? massRate.push_back(energies[i] / masses[i]);
? volumesRate.push_back(energies[i] / volumes[i]);
? finalRate.push_back(massRate[i] * k + volumesRate[i]);
? list.push_back(-1);
?}
?vector finalRateSort(finalRate);
?for (int i = 0; i < numberOfRadLiquid; i++)
?{
? double max = 0;
? for (int j = 0; j < numberOfRadLiquid; j++)
? {
?? if (max < finalRate[j])
?? {
??? max = finalRate[j];
??? finalRateSort[i] = max;
??? list[i] = j;
?? }
? }
? finalRate[list[i]] = 0;
?}
?int massNow = 0;
?int volNow = 0;
?int maxEn = 0;
?int n = 0;
?while(true)
?{
? if (n == numberOfRadLiquid)
?? break;
? volNow += volumes[list[n]];
? if (volNow > reactorCap)
? {
?? volNow -= volumes[list[n]];
?? n++;
?? continue;
? }
? massNow += masses[list[n]];
? if (massNow > criticalMass)
? {
?? massNow -= masses[list[n]];
?? n++;
?? continue;
? }
? maxEn +=energies[list[n]];
? n++;
? if (n == numberOfRadLiquid)
?? break;
?}
?return maxEn;
}
總結(jié)
- 上一篇: saltstack中salt-sndic
- 下一篇: PTA L2-16愿天下有情人都是失散多