73 lines
2.0 KiB
C++
73 lines
2.0 KiB
C++
#include <iostream>
|
|
#include <vector>
|
|
#include <limits>
|
|
#include <chrono>
|
|
#include <iomanip>
|
|
#include <cstdint>
|
|
|
|
class LCG {
|
|
private:
|
|
uint64_t value;
|
|
const uint64_t a = 1664525;
|
|
const uint64_t c = 1013904223;
|
|
const uint64_t m = 1ULL << 32;
|
|
|
|
public:
|
|
LCG(uint64_t seed) : value(seed) {}
|
|
|
|
uint64_t next() {
|
|
value = (a * value + c) % m;
|
|
return value;
|
|
}
|
|
};
|
|
|
|
int64_t max_subarray_sum(int n, uint64_t seed, int min_val, int max_val) {
|
|
LCG lcg(seed);
|
|
std::vector<int64_t> random_numbers(n);
|
|
for (int i = 0; i < n; ++i) {
|
|
random_numbers[i] = lcg.next() % (max_val - min_val + 1) + min_val;
|
|
}
|
|
|
|
int64_t max_sum = std::numeric_limits<int64_t>::min();
|
|
int64_t current_sum = 0;
|
|
int64_t min_sum = 0;
|
|
|
|
for (int i = 0; i < n; ++i) {
|
|
current_sum += random_numbers[i];
|
|
max_sum = std::max(max_sum, current_sum - min_sum);
|
|
min_sum = std::min(min_sum, current_sum);
|
|
}
|
|
|
|
return max_sum;
|
|
}
|
|
|
|
int64_t total_max_subarray_sum(int n, uint64_t initial_seed, int min_val, int max_val) {
|
|
int64_t total_sum = 0;
|
|
LCG lcg(initial_seed);
|
|
for (int i = 0; i < 20; ++i) {
|
|
uint64_t seed = lcg.next();
|
|
total_sum += max_subarray_sum(n, seed, min_val, max_val);
|
|
}
|
|
return total_sum;
|
|
}
|
|
|
|
int main() {
|
|
const int n = 10000;
|
|
const uint64_t initial_seed = 42;
|
|
const int min_val = -10;
|
|
const int max_val = 10;
|
|
|
|
auto start_time = std::chrono::high_resolution_clock::now();
|
|
int64_t result = total_max_subarray_sum(n, initial_seed, min_val, max_val);
|
|
auto end_time = std::chrono::high_resolution_clock::now();
|
|
|
|
auto duration = std::chrono::duration_cast<std::chrono::microseconds>(end_time - start_time);
|
|
|
|
std::cout << "Total Maximum Subarray Sum (20 runs): " << result << std::endl;
|
|
std::cout << "Execution Time: " << std::fixed << std::setprecision(6) << duration.count() / 1e6 << " seconds" << std::endl;
|
|
|
|
std::cout << "Press Enter to exit...";
|
|
std::cin.get();
|
|
|
|
return 0;
|
|
} |