NYOJ 453 小珂的烦恼 模拟
2012-05-08 14:31 javaspring 阅读(289) 评论(0) 编辑 收藏 举报这道题是大一的一次月赛题目,,悲崔的是,我想了好久才想出来,想出来还超时了,,太菜了,太菜了。。。后来仔细想了想,改了一个地方就过了。。
思路:就是模拟,判断当前没出现过的最小的是哪个数即可。判断第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
#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; }