这道题是大一的一次月赛题目,,悲崔的是,我想了好久才想出来,想出来还超时了,,太菜了,太菜了。。。后来仔细想了想,改了一个地方就过了。。
思路:就是模拟,判断当前没出现过的最小的是哪个数即可。判断第i+1个数的时候,从num[i]开始循环,找到后break即可。我刚开始是从i+1开始循环的,tle了。。。。题目:
小珂的烦恼
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
小珂遇到了一个麻烦的问题,有这样的N对数(1,2),(3,5),(4,7),(6,10)……,第i对的差值为i,第n对数的第一个数为没在前n-1对中出现过的数中最小的,现在要找第n对这样的数,你能帮帮他吗?
-
输入
-
第一行只有一个整数m(m<=10000),表示测试数据组数。
接下来的m行,每行有一个整数n(n<=100000)。
输出
- 输出第n对数,每组输出占一行。 样例输入
-
2 1 3
样例输出
-
1 2 4 7
-
第一行只有一个整数m(m<=10000),表示测试数据组数。
#include <iostream>
#include <cstdio>
#include <string.h>
using namespace std;
const int N = 100010;
int num[N];
int vis[N*10];
void init()
{
num[1] = 1;
memset(vis,0,sizeof(vis));
vis[1] = 1;
for(int i = 1;i <= N-5;++i)
{
int x = num[i] + i;
vis[x] = 1;
vis[num[i]] = 1;
for(int j = num[i] + 1;;++j)
{
if(!vis[j])
{
num[i+1] = j;
break;
}
}
}
}
int main()
{
int numcase;
init();
scanf("%d",&numcase);
for(int i = 1;i <= numcase;++i)
{
int n;
scanf("%d",&n);
printf("%d %d\n",num[n],num[n]+n); }
return 0;
}