C/C++

Программирование, с++, срочно

У вас есть возможность выполнять n квестов. Если вы выполняете i-й квест, вы получаете ai
монет. Вы можете выполнить не больше одного квеста в день.

Однако, после того как вы выполнили квест, вы не можете выполнить его снова в течение следующих k дней. (Например, если k=2 и вы выполняете 1 -й квест в 1 -й день, тогда вы не сможете выполнить этот квест снова во 2-й или в 3-й день, но сможете его выполнить в 4 -й день.)

Заданы два целых числа c и d. Найдите максимальный k такой, что возможно получить как минимум c монет за d дней. Если таких k не существует, выведите Impossible. Если k может быть бесконечно большим, выведите Infinity.

Входные данные
Первая строка содержит одно число t (1≤t≤10^4) — количество наборов входных данных.
Первая строка каждого набора содержит три целых числа n,c,d (2≤n≤2⋅10^5; 1≤c≤10^16; 1≤d≤2⋅10^5) — количество квестов, количество необходимых монет и количество дней.

Вторая строка каждого набора содержит n целых чисел a1,a2,…,an (1≤ai≤10^9) — награды за квесты.

Гарантируется что сумма n по всем наборам входных данных не превосходит 2⋅10^5, а сумма d по всем наборам входных данных не превосходит 2⋅10^5.

Выходные данные
Для каждого набора входных данных выведите:

если таких k не существует, выведите Impossible; если k может быть бесконечно большим, выведите Infinity; иначе, выведите одно целое число — максимальный k такой что возможно получить как минимум c монет в течение d дней.
Пример
входные данные
6
2 5 4
1 2
2 20 10
100 10
3 100 3
7 2 6
4 20 3
4 5 6 7
4 100000000000 2022
8217734 927368 26389746 627896974
2 20 4
5 1
выходные данные
2
Infinity
Impossible
1
12
0
Примечание
В первом тесте, один из способов получить 5
монет за 4
дня с k=2
состоит в следующем:

день 1: выполнить квест 2, и получить 2
монеты;
день 2: выполнить квест 1, и получить 1
монету;
день 3: ничего не делать;
день 4: выполнить квест 2, и получить 2
монеты.
Суммарно мы получили 2+1+2=5
монет.

Во втором тесте, мы можем получить более 20
монет в первый день, выполнив лишь только первый квест. Выполнив первый квест, мы сразу получим 100
монет, значит значение k
может быть бесконечно большим, так как нам никогда не понадобится выполнить ещё один квест.

В третьем тесте, что бы мы не делали, мы не можем получить 100
монет за 3
дня.
Ладно, держи свои квесты:
 #include 
#include
#include

using namespace std;

typedef unsigned short idx_t;
typedef unsigned rew_t;
typedef unsigned long long sum_t;

int main() {
idx_t t;
cin >> t;

for (idx_t u = 0; u < t; u++) {
idx_t n, d;
sum_t c;
cin >> n >> c >> d;

vector rewards;
for (idx_t i = 0; i < n; i++) {
rew_t r;
cin >> r;
const auto ip = lower_bound(rewards.begin(), rewards.end(), r, [](rew_t a, rew_t b) { return a > b; });
rewards.insert(ip, r);
}

vector sums;
sums.push_back(*rewards.begin());
for (auto r = next(rewards.begin()); r != rewards.end(); r++) {
sums.push_back((sum_t)*sums.rbegin() + *r);
}

if (sums[min(d, n) - 1] >= c) {
cout
Саша Тармосин
Саша Тармосин
87 571
Лучший ответ
Василий Конырев Что за чудо дерево?
{массив} -> sort{массив} (O n^logn) больше не тащит?
{массив} -> чудо дерево -> {массив} (O n?) ...
Если бы это работало быстрее, то запихнули бы это дерево прямо в sort, set и в клумбу)
О... пользуясь случаем передаю привет Реципиенту)
Саша Тармосин Автор вопроса - не он.

У Евгения - дружбана или клона Министрелии - бомбануло, что его/её ответ скрыли. Они в комментариях обмениваются ссылками на вопросы, где надо похайповать. Если ты запустишь его/её код, то увидишь, что он не работает на тестовых данных автора (впрочем, и без запуска видно, что он считает не то, что нужно). Но деткам не приходит в голову, что они могли что-то не так сделать, они видят в этом всемирный заговор против них лично.

Сейчас вообще большая беда с молодёжью в программировании - или до упора отстаивают свою неправоту, или готовы переделать весь проект по получении одного некритичного замечания "на будущее". Нет взвешенного, осмысленного подхода.

Жаль, у меня времени нет, чтобы на час-полтора сосредоточиться и решить эту штуку. Задача - не особо сложная.
АИ спешит на помощь. Помогите. Как я могу помочь вам.
Николай Тронин
Николай Тронин
43 053
Привет! Задача, которую ты описал, относится к типу задачи о рюкзаке (knapsack problem), которая является NP-полной и имеет много различных подходов к решению. Для точного решения такой задачи обычно используются динамическое программирование или метод ветвей и границ. Однако, для решения данной задачи необходимо обработать входные данные и написать алгоритм, что выходит за рамки кратких ответов, которые я могу предоставить.

Рекомендую изучить алгоритмы решения задачи о рюкзаке и попробовать реализовать его самостоятельно или использовать готовые реализации, доступные в различных языках программирования. Это позволит тебе эффективно решать подобные задачи. Удачи!
Игорь Нефф Нет тут никакой задачи о рюкзаке. Твой ИИ наврал тебе, как обычно.
Реципиенту привет )
 #include  
#include
#include

using namespace std;

int main() {
int t;
cin >> t;

while (t--) {
int n, c, d;
cin >> n >> c >> d;

vector rewards(n);
for (int i = 0; i < n; i++) {
cin >> rewards[i];
}

sort(rewards.rbegin(), rewards.rend()); // Сортируем награды в порядке убывания

long long total = 0; // Общее количество монет
int max_k = 0; // Максимальное значение k

for (int i = 0; i < n; i++) {
total += rewards[i];
if (total >= c) {
max_k = i + 1; // Найден максимальный k, при котором сумма достигает или превышает c
break;
}
}

if (max_k == 0) {
cout
Игорь Нефф С твоим ответом произошло именно то, что должно происходить со всякими бреднями. Иди теперь бахвалься в следующем, может, там по невежеству твою копипасту кто-то лайкнет.
Автор вопроса, то есть Реципиент лошок)
Arman Karapetyan
Arman Karapetyan
94