C++ Chanel: post #150 — TG.ME

Решение с объяснением:
#include <iostream>
#include <vector>
using namespace std;

//вспомогательная функция рассчитывает кол-во различных мест внутри ящика
long long counter(const vector<long long>& v,const vector<long long>& rv){
long long result{};

if(v == rv) // если наш куб равен размеру ящика,то он вмещаеться только один раз
return 1;

for(long long i = v[1];i<=rv[1];++i){ // идем по длине
result+=rv[0] - v[0] + 1; // каждую ширину в результат
}

int z = rv[2] - v[2] + 1; // высота
return result*z;
}

int main(){
int t;cin>>t;
vector<long long> result;

for(int d = 0;d<t;++d){
long long x,y,z,S;cin>>x>>y>>z>>S;
long long maxValue{};
for(long long a = 1;a<=x;++a){
for(long long b = 1;b<=y;++b){

long long c = S/(a*b); // можно сделать цикл от 1 до z - не проходит по рантайму
// так как будут повторы a и b

if(z>=c){ // если с не выходит за пределы

if(a*b*c == S ){ // если объем равен k ( в моем случае S)
long long temp = counter({a,b,c},{x,y,z}); // создаю переменную
// для хранения расчетов;
// альтернативы:
/*
1. создать переменную в условии if
2. вызвать counter в присвоении и if
функция будет вызываться по два раза
*/

if(temp > maxValue)
maxValue = temp;
}
}
}
}
result.push_back(maxValue); // вносим в наш вектор наибольшее значение,
// если такого не нашлось - выводим ноль
}
for(const auto& i: result){ // вывод
cout<<i<<endl;
}
}
🔥4
August 21, 2024 1.4K 2