C语言/C++常见习题问答集锦(五十七) 之小C的随机数选择
程序之美
题目摘要
小C最近玩上了新游戏,他想在网上交一些朋友,但他不知道应该交什么样的朋友。
首先,小C需要一个随机数生成器来帮助他进行选择,小C找到了一个可生成n个可行朋友id的随机数生成器,代码如下
#include<iostream>
using namespace std;
int n,seed,arr[1000001];
void Rand(int seed)
{
seed|=0x123456 ;
for(int i=1;i<=n;i++){
arr[i ]=seed;
seed^=(arr[i]+i);
seed%=10000000;
seed+=1;
}
}
int main()
{
cin>>n>>seed;Rand( seed);
//todo
return 0;
}
得到n个随机数后将他们进行排序。小C会进行m次挑选,每次挑选下标为x的数,选择第x大的数的人交朋友。
输入格式:
第一行包括两个数字n seed
第二行输入一个数字m表示将会进行n组询问
接下来m行 每i行包含一个数字xi,表示将要选择第xi大的数
输出格式:
输出包括m行 每行输出询问的结果
输入样例
10 233
5
2
4
6
8
10
输出样例:
6
10
25
60
1193215
数据范围与提示
n<=1e7,m<=1e5
实例代码:
#include <iostream>
#include <algorithm>
using namespace std;
int n, seed, arr[1000001];
void Rand(int seed)
{
seed |= 0x123456;
for (int i = 1; i <= n; i++)
{
arr[i] = seed;
seed ^= (arr[i] + i);
seed %= 10000000;
seed += 1;
}
}
int main()
{
cin >> n >> seed;
Rand(seed);
sort(arr+1, arr+n+1);
cout << "请输入:" << endl;
int m;
cin >> m;
if (m <= 0)
{
cout<<"输入非法数据!"<<endl;
return -1;
}
int* xi = new int[m];
for (int i = 0; i < m; i++)
{
cin >> xi[i];
}
cout << "输出结果:" << endl;
for (int i = 0; i < m; i++)
{
cout << xi[i] << '\n';
}
if(xi != NULL){
delete xi;
}
return 0;
}