211252026-01-12 12:21:23markfsibianMaximális szorzat (50 pont)cpp17Futási hiba 0/502ms764 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <fstream>

using namespace std;

int n, k, b, a;
int m = 1000000007;

vector<int> v;

ifstream fin("be5.txt");

#define cin fin

void meg() {	
	int res = 1;
	for (auto& e : v)
	{
		res = (res *(long long) e) % m;
	}
	cout << res << endl;
}

void fix() {
	if (n >= 2)
	{
		int i = 1;
		while (k)
		{
			if (v[i - 1] >= 0)
			{
				if (i == n || v[i - 1] <= v[i])
				{
					v[i - 1]++;
					k--;
					meg();
				}
				else if (i < v.size() - 1)
					i++;
				else
					break;
			}
			else
				i++;
		}
	}
	else
	{
		v[0] = v[0] + k;
		k = 0;
	}
}

void nullak() {
	if (n >= 2)
	{
		int i = 1;
		while (k)
		{
			if (v[i - 1] < -1)
			{
				if (v[i - 1] <= v[i])
				{
					v[i - 1]++;
					k--;
				}
				else if (i < v.size() - 1)
					i++;
				else
					break;
			}
			else
				i++;
		}
	}
	else
	{
		v[0] = v[0] + k;
		k = 0;
	}
}

int main() {
	iostream::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin >> n >> k >> b;
	for (int i = 1; i <= n; ++i)
	{
		cin >> a;
		v.push_back(a);
	}
	sort(v.begin(), v.end());
	if ((v[0] >= 0 && b > 0))
		cout << -1;
	else if (v[0] >= 0)
	{
		while (k)
		{
			fix();
			sort(v.begin(), v.end());
		}
		meg();
	}
	else if (v[0] < 0 && b == 0)
	{
		int i = 1;
		for (auto i = v.rbegin(); i != v.rend(); ++i)
		{
			if (*i < 0)
			{
				k = k + *i;
				*i = 0;
			}
		}
		if (k < 0)
			cout << -1;
		else if (k == 0)
			cout << 0;
		else
		{
			while (k)
			{
				fix();
				sort(v.begin(), v.end());
			}
			meg();
		}

	}
	else if (v[0] < 0 && b > 0 && b % 2 == 0)
	{
		int i = 1, db = 0, t = 0;
		reverse_iterator<vector<int>::iterator> asd;
		for (auto i = v.rbegin(); i != v.rend(); ++i)
			if (*i < 0)
			{
				asd = i;
				t = distance(i, v.rend());
				break;
			}
		for (auto i = asd; i != v.rend() && t - db > b; ++i)
		{
			if (*i < 0)
			{
				k = k + *i;
				*i = 0;
				db++;
				meg();
			}
		}
		if (k < 0)
			cout << -1;
		else if (k == 0)
			cout << 0;
		else
		{
			for (int i = 0; i < n; ++i)
				if (v[i] == 0)
				{
					v[i]++;
					k--;
					meg();
				}
			while (k)
			{
				fix();
				sort(v.begin(), v.end());
			}
			meg();
		}
	}
	else if (v[0] < 0 && b > 0 && b % 2 == 1)
	{
		int i = 1, db = 0, t = 0;
		reverse_iterator<vector<int>::iterator> asd;
		for (auto i = v.rbegin(); i != v.rend(); ++i)
			if (*i < 0)
			{
				asd = i;
				t = distance(i, v.rend());
				break;
			}
		for (auto i = asd; i != v.rend() && t - db > b; ++i)
		{
			if (*i < 0)
			{
				k = k + *i;
				*i = 0;
				db++;
				if (!t)
					t = distance(v.rend(), i);
			}
		}
		if (k < 0)
			cout << -1;
		else if (k == 0)
			cout << 0;
		else
		{
			while (k)
			{
				nullak();
				sort(v.begin(), v.end());
			}
			while (k)
			{
				fix();
				sort(v.begin(), v.end());
			}
			meg();
		}
	}
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base0/50
1Futási hiba0/01ms508 KiB
2Futási hiba0/01ms508 KiB
3Futási hiba0/01ms316 KiB
4Futási hiba0/01ms316 KiB
5Futási hiba0/02ms764 KiB
6Futási hiba0/21ms316 KiB
7Futási hiba0/22ms316 KiB
8Futási hiba0/21ms316 KiB
9Futási hiba0/21ms316 KiB
10Futási hiba0/21ms316 KiB
11Futási hiba0/21ms316 KiB
12Futási hiba0/11ms500 KiB
13Futási hiba0/11ms316 KiB
14Futási hiba0/11ms316 KiB
15Futási hiba0/11ms316 KiB
16Futási hiba0/11ms316 KiB
17Futási hiba0/11ms316 KiB
18Futási hiba0/11ms336 KiB
19Futási hiba0/11ms316 KiB
20Futási hiba0/11ms316 KiB
21Futási hiba0/11ms316 KiB
22Futási hiba0/11ms316 KiB
23Futási hiba0/11ms316 KiB
24Futási hiba0/11ms316 KiB
25Futási hiba0/21ms316 KiB
26Futási hiba0/21ms316 KiB
27Futási hiba0/21ms316 KiB
28Futási hiba0/11ms316 KiB
29Futási hiba0/21ms316 KiB
30Futási hiba0/11ms316 KiB
31Futási hiba0/11ms316 KiB
32Futási hiba0/21ms316 KiB
33Futási hiba0/21ms316 KiB
34Futási hiba0/11ms316 KiB
35Futási hiba0/21ms316 KiB
36Futási hiba0/21ms316 KiB
37Futási hiba0/21ms316 KiB
38Futási hiba0/21ms316 KiB
39Futási hiba0/11ms316 KiB