关闭

POJ 2081

标签: poj
163人阅读 评论(0) 收藏 举报
分类:

Description
The Recaman’s sequence is defined by a0 = 0 ; for m > 0, a m = a m−1 − m if the rsulting a m is positive and not already in the sequence, otherwise a m = a m−1 + m.
The first few numbers in the Recaman’s Sequence is 0, 1, 3, 6, 2, 7, 13, 20, 12, 21, 11, 22, 10, 23, 9 …
Given k, your task is to calculate a k.

Input
The input consists of several test cases. Each line of the input contains an integer k where 0 <= k <= 500000.
The last line contains an integer −1, which should not be processed.

Output
For each k given in the input, print one line containing a k to the output.

Sample Input

7
10000
-1

Sample Output

20
18658

题意:
题意大概就是就是第m个位置的数是根据第m-1位置的数推出来的如果a[m-1]-m>0,并且a[m-1]-m在前面的序列中没有出现过那么a[m] = a[m-1]-m否则a[m] = a[m-1]+m

思路:
公式都已经写好了,只需要加一个bool值来标记当前a[m]是否出现过就可以了

代码:

import java.util.Arrays;
import java.util.Scanner;

public class Test1 {
    private static int[] array = new int[500005];
    private static boolean[] flag = new boolean[10000000]; 
    public static void main(String[] args) {
    Arrays.fill(flag, false);
    Arrays.fill(array, 0);
    for (int i = 1; i <=500000 ; i++) {
        if (array[i-1]-i>0 && flag[array[i-1]-i]==false) {
        array[i] = array[i-1]-i;
        }else 
        array[i]= array[i-1]+i;
        flag[array[i]] = true;

    }
    Scanner scanner = new Scanner(System.in);
    while (scanner.hasNext()) {
        int n = scanner.nextInt();
        if (n<0) 
        break;
        System.out.println(array[n]);
    }
    scanner.close();
    }

}
0
0
查看评论

poj 2081

 题目意思: a0 = 0 ;当m > 0并且 am 为正数且am 之前未出现过,am = am−1 − m 。否则 am = am−1 + m。 我来说说解这题的经历:用bool abc[]来记录是否之前出现过,这里出现了两个问题:一个是用C提交,结果ce(不止一次了,对...
  • designer_
  • designer_
  • 2010-03-06 22:53
  • 387

POJ——2081

//我承认此题是一道超级水题,但是我WA了N次,此题很坑,需谨慎,要考虑,初始化要注意,另外,a[i]的值可能大于max.,所以,要开大一点的数组来初始化。// AC代码: #include #include #include using namespace std; #define max...
  • zyx520ytt
  • zyx520ytt
  • 2015-07-13 21:25
  • 154

acm 2081

#include #include void main() {  int n,i,j;  char inputChar[12];  char outCh[7]="6"; scanf("%d%*c",&n); ...
  • rudy45
  • rudy45
  • 2013-05-23 18:32
  • 437

杭电2081

#include int main() {     int t,i;char a[13],b[7];     scanf("%d",&t);     while(t--) ...
  • ycyy1993
  • ycyy1993
  • 2014-07-25 20:09
  • 52

poj 2081 简单递推

#include #include #define N 510000 int dp[N]; int f[10000000]; int main() { int k,n,m,i,j; dp[0]=0; memset(f,0,sizeof(f)); for(i=1;i&...
  • u011483306
  • u011483306
  • 2015-02-06 19:59
  • 422

杭电ACM 2081 手机短号

http://acm.hdu.edu.cn/showproblem.php?pid=2081 #include using namespace std; int main() { int N; cin>>N; while(N--){ char a[11]; ci...
  • xujinsmile
  • xujinsmile
  • 2012-08-07 19:24
  • 1318

poj解题报告——2081

题意:第m个位置的数是根据第m-1位置的数推出来的如果a[m-1]-m>0,并且a[m-1]-m在前面的序列中没有出现过那么a[m] = a[m-1]-m否则a[m] = a[m-1]+m 代码如下 #include #include #define N 500010 int ch[N];...
  • Lingfu74
  • Lingfu74
  • 2015-03-01 14:00
  • 259

POJ 2081 解题报告

这道题是道简单题。我用的set,所以时间巨久。 thestoryofsnow 2081 Accepted 19116K 2438MS C++ 911B /* ID: thestor1 LANG: C++ TASK: poj2081 */ #incl...
  • thestoryofsnow
  • thestoryofsnow
  • 2015-04-15 01:49
  • 236

杭电acm--2081

大家都知道,手机号是一个11位长的数字串,同时,作为学生,还可以申请加入校园网,如果加入成功,你将另外拥有一个短号。假设所有的短号都是是 6+手机号的后5位,比如号码为13512345678的手机,对应的短号就是645678。 现在,如果给你一个11位长的手机号码,你能找出对应的短号吗?  ...
  • qq_26919527
  • qq_26919527
  • 2015-09-19 21:56
  • 655

POJ 2081 JAVA

http://poj.org/problem?id=2081 一个序列问题,为了时间效率,最好的方法是先计算出整个序列,这种时间复杂度其实只有O(1),然而如果对于每个输入分别计算,其实根本算法上并没有差别。 布尔数组开个400W就够了,因为最大值是3012500,表示结果的数组其实没必要开这么大。...
  • Lyz1052
  • Lyz1052
  • 2015-11-12 18:19
  • 253
    个人资料
    • 访问:112168次
    • 积分:1387
    • 等级:
    • 排名:千里之外
    • 原创:41篇
    • 转载:3篇
    • 译文:0篇
    • 评论:32条
    博客专栏
    最新评论