// Task: CUK #include <iostream> #include <vector> #include <algorithm> using namespace std; int main(){ int n; cin >> n; // Illustration: // // * a = 1(1) // ** b = 1(2) // **** c = 2(4) // **** // ******* d = 1(7) vector<int> packs; packs.reserve(n); int sweetCount; for (int i = 0; i < n; ++i) { cin >> sweetCount; packs.push_back(sweetCount); } sort(packs.begin(), packs.end()); const long long MODULUS = 1000000007; long long subsetCount = 0; int currentSum = 0; long long previousCombinations = 1; int i = 0; while (i < n) { int currentPackSize = packs[i]; if (currentPackSize > currentSum + 1){ break; } int samePacksCount = 1; ++i; while (i < n && packs[i] == currentPackSize) { ++samePacksCount; ++i; } int currentCombinations = 1; for (int j = 0; j < samePacksCount; ++j) { currentCombinations = currentCombinations * 2 % MODULUS; } currentCombinations -= 1;// TODO: Makes sense if currentCombinations > 0 int tmp = previousCombinations * currentCombinations % MODULUS; subsetCount = (subsetCount + tmp)%MODULUS; previousCombinations = currentCombinations; currentSum += samePacksCount*currentPackSize; } cout << subsetCount << endl; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 | // Task: CUK #include <iostream> #include <vector> #include <algorithm> using namespace std; int main(){ int n; cin >> n; // Illustration: // // * a = 1(1) // ** b = 1(2) // **** c = 2(4) // **** // ******* d = 1(7) vector<int> packs; packs.reserve(n); int sweetCount; for (int i = 0; i < n; ++i) { cin >> sweetCount; packs.push_back(sweetCount); } sort(packs.begin(), packs.end()); const long long MODULUS = 1000000007; long long subsetCount = 0; int currentSum = 0; long long previousCombinations = 1; int i = 0; while (i < n) { int currentPackSize = packs[i]; if (currentPackSize > currentSum + 1){ break; } int samePacksCount = 1; ++i; while (i < n && packs[i] == currentPackSize) { ++samePacksCount; ++i; } int currentCombinations = 1; for (int j = 0; j < samePacksCount; ++j) { currentCombinations = currentCombinations * 2 % MODULUS; } currentCombinations -= 1;// TODO: Makes sense if currentCombinations > 0 int tmp = previousCombinations * currentCombinations % MODULUS; subsetCount = (subsetCount + tmp)%MODULUS; previousCombinations = currentCombinations; currentSum += samePacksCount*currentPackSize; } cout << subsetCount << endl; return 0; } |