社区讨论
提供一个数据生成器
P4135作诗参与者 6已保存回复 18
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 18 条
- 当前快照
- 1 份
- 快照标识符
- @mhj2xam5
- 此快照首次捕获于
- 2025/11/03 19:51 4 个月前
- 此快照最后确认于
- 2025/11/03 20:41 4 个月前
CPP
#include <iostream>
#include <vector>
#include <random>
#include <algorithm>
#include <set>
#include <chrono>
using namespace std;
// 可以在代码中方便修改的常量
const int MAX_N = 10; // n, m, c的最大值
class DataGenerator {
private:
mt19937 rng;
public:
DataGenerator() {
// 使用毫秒级时间作为随机数种子
auto seed = chrono::high_resolution_clock::now().time_since_epoch().count();
rng.seed(static_cast<unsigned int>(seed));
}
// 生成指定范围内的随机整数
int randInt(int l, int r) {
uniform_int_distribution<int> dist(l, r);
return dist(rng);
}
void generate() {
// 生成n, c, m
int n = MAX_N;
int c = randInt(1, min(n, MAX_N)); // c不能超过n
int m = MAX_N;
cout << n << " " << c << " " << m << endl;
// 生成第二行的n个整数,确保恰好有c个不同的数字,且所有数字都在1到c范围内
vector<int> arr(n);
set<int> uniqueNums;
// 先生成c个不同的数字,范围是1到c
for (int i = 1; i <= c; i++) {
uniqueNums.insert(i);
}
// 将这c个不同的数字随机分配到数组中
vector<int> distinctNums(uniqueNums.begin(), uniqueNums.end());
// 前c个位置放不同的数字(即1到c的所有数字)
for (int i = 0; i < c; i++) {
arr[i] = distinctNums[i];
}
// 剩下的位置随机从c个数字中选择
for (int i = c; i < n; i++) {
arr[i] = distinctNums[randInt(0, c - 1)];
}
// 打乱数组顺序
shuffle(arr.begin(), arr.end(), rng);
// 输出第二行
for (int i = 0; i < n; i++) {
cout << arr[i];
if (i < n - 1) cout << " ";
}
cout << endl;
// 生成m个查询区间[L, R]
for (int i = 0; i < m; i++) {
int L = randInt(1, n);
int R = randInt(L, n);
cout << L << " " << R << endl;
}
}
};
int main() {
// freopen("in.txt","w",stdout);
DataGenerator generator;
generator.generate();
return 0;
}
回复
共 18 条回复,欢迎继续交流。
正在加载回复...