153742025-02-19 09:34:12ZsBalazsMaximális szorzat (50 pont)cpp17Accepted 50/5082ms1896 KiB
#include <bits/stdc++.h>
using namespace std;

int main() {
	int n, k, b;
	cin >> n >> k >> b;
	
	vector<int> elemek;
	
	for (int i = 0; n > i; i++) {
	    int temp;
	    cin >> temp;
	    
	    elemek.push_back(temp);
	}
	
	vector<int> negati;
	vector<int> pozi;
	
	for (int elem : elemek) {
	    if (elem < 0) {
	        negati.push_back(elem);
	    } else {
	        pozi.push_back(elem);
	    }
	}
	
	// csokkeno sorrend
	sort(negati.rbegin(), negati.rend());
    
    int valt = negati.size() - b;
    
    if (valt < 0) {
        cout << -1 << endl; 
        return 0;
    }
    
    int felhasznalt = 0;
    
    for (int i = 0; valt > i; i++) {
        felhasznalt += (0 - negati[i]);
        pozi.push_back(0);
    }
    
    int hasznalhato = k - felhasznalt;
    
    if (hasznalhato < 0) {
        cout << -1 << endl; 
        return 0;
    }
    
    priority_queue<int> szamok;
    
    for (int szam : pozi) {
        szamok.push(szam * -1);
    }
    
    while (!szamok.empty() && hasznalhato--) {
        int current = szamok.top() * -1;
        szamok.pop();
        
        szamok.push((current+1) * -1);
    }
    
    if (hasznalhato > 0) {
        priority_queue<int> minus;
        
        for (int i = valt; negati.size() > i; i++) {
            minus.push(negati[i] * -1);
        }
        
        while (hasznalhato--) {
            int current = minus.top() * -1;
            minus.pop();
            
            minus.push((current+1) * -1);
        }
        
        int countNega = 0;
        
        long long szorzat = 1;
    
        while (!szamok.empty()) {
            szorzat = (szorzat * (long long)(szamok.top() * -1)) % 1000000007;
            szamok.pop();
        }
        
        while (!minus.empty()) {
            if (minus.top()*-1 < 0) {
                countNega++;
            }
            
            szorzat = (szorzat * (long long)(minus.top()*-1)) % 1000000007;
            minus.pop();
        }
        
        if (countNega != b) {
            cout << -1 << endl;
        } else {
            cout << szorzat << endl;
        }
        
        return 0;
    }
    
    long long szorzat = 1;
    
    while (!szamok.empty()) {
        szorzat = (szorzat * (long long)(szamok.top() * -1)) % 1000000007;
        szamok.pop();
    }
    
    for (int i = valt; negati.size() > i; i++) {
        szorzat = (szorzat * (long long)(negati[i])) % 1000000007;
    }
    
    cout << szorzat << endl;
    
    return 0;
}
SubtaskSumTestVerdictTimeMemory
base50/50
1Accepted0/01ms316 KiB
2Accepted0/01ms316 KiB
3Accepted0/01ms316 KiB
4Accepted0/01ms316 KiB
5Accepted0/04ms604 KiB
6Accepted2/21ms316 KiB
7Accepted2/21ms316 KiB
8Accepted2/21ms316 KiB
9Accepted2/21ms508 KiB
10Accepted2/27ms592 KiB
11Accepted2/268ms1800 KiB
12Accepted1/174ms1876 KiB
13Accepted1/11ms500 KiB
14Accepted1/17ms564 KiB
15Accepted1/118ms688 KiB
16Accepted1/137ms1020 KiB
17Accepted1/121ms988 KiB
18Accepted1/110ms1072 KiB
19Accepted1/165ms1892 KiB
20Accepted1/154ms1836 KiB
21Accepted1/182ms1832 KiB
22Accepted1/143ms1832 KiB
23Accepted1/175ms1512 KiB
24Accepted1/174ms1896 KiB
25Accepted2/22ms316 KiB
26Accepted2/26ms508 KiB
27Accepted2/246ms1076 KiB
28Accepted1/146ms1016 KiB
29Accepted2/223ms780 KiB
30Accepted1/161ms1392 KiB
31Accepted1/132ms1452 KiB
32Accepted2/22ms316 KiB
33Accepted2/263ms1556 KiB
34Accepted1/164ms1348 KiB
35Accepted2/264ms1452 KiB
36Accepted2/261ms1444 KiB
37Accepted2/261ms1524 KiB
38Accepted2/261ms1332 KiB
39Accepted1/12ms316 KiB