zoukankan      html  css  js  c++  java
  • hdu--1216--暴力过了<链表没想到>

    这题 题意别搞错就是了  它给你的数据 很容易让你种错觉 是求第N位素数 但其实不是这样的

    而是第一个数如果给了你一个2 那么后面的4 6 8 10 ......都应该被pass 然后接下去就是3了 再后面的 9 15 21..同样被pass就是说在一个 2~inf的数字串中距离选出的那个数字是 K*I 倍的都应该被pass<这个数首先未被pass>

    然后 我采取的做法是 暴力 因为 数据不大的 就问你到3000为止 而且只需要一次预处理过后 就是直接O(1)的查询了 肯定不会TLE的

    看到别人是用了 结构体 模拟链表写的 太cool了  完全没想到  写的狠飘逸

    我直接把他的 核心代码 放上来

          touch  me

     1 #include <iostream>
     2 #include <cstring>
     3 using namespace std;
     4 
     5 const int size = 38000;
     6 bool vis[size];
     7 int ans[3500];
     8 
     9 void init( )
    10 {
    11     int cnt = 1 , temp , times;
    12     memset( vis , true , sizeof(vis) );
    13     for( int i = 2 ; i<size ; i++ )
    14     {
    15         if( cnt>=3001 )
    16             break;
    17         if( vis[i] )
    18         {
    19             ans[cnt++] = i;
    20             temp = i+1;
    21             times = 0;
    22             while( temp<size )
    23             {
    24                 if( vis[temp] )
    25                 {
    26                     times++;
    27                 }
    28                 if( times % i == 0 )
    29                 {
    30                     vis[temp] = false;
    31                 }
    32                 temp ++;
    33             }        
    34         }
    35     }
    36 }
    37 
    38 int main()
    39 {
    40     cin.sync_with_stdio(false);
    41     int n;
    42     init( );
    43     while( cin >> n && n )
    44     {
    45         cout << ans[n] << endl;
    46     }
    47     return 0;
    48 }
    View Code
    struct Node
    {
        int v;
        int next;
    };
    Node L[35001];
        for(i=2;i<=37999;i++)
        {
            L[i].v=i;
            L[i].next = i+1;
        }
        L[38000].v=38000;
        L[38000].next=-1;
        top=1;
        for( i=2 ; L[i].next!=-1 ; i=L[i].next )
        {
            res[top++] = L[i].v;
            if( top>=3001 ) 
                break;
            j=i;
            while( L[j].next!=-1 )
            {
                k=0;
                while( L[j].next!=-1 && k<L[i].v )
                {
                    k++;
                    p = j;
                    j = L[j].next;
                }
                if( L[j].next!=-1 )
                {
                    L[p].next=L[j].next;
                }
            }
        }

    好代码 就不 折叠了 =-=

    有点迷惘啊 ....

    突然想起买个梦幻号玩了 2 3年了 哎..........

    just follow your heart
  • 相关阅读:
    Java中Date日期字符串格式的各种转换
    Redis集群搭建与简单使用
    Java中的Redis应用
    java的linux命令
    Lucene全文检索引擎
    设置Xshell中支持中文
    Java并发Fork-Join框架原理解析
    java线程
    Django-路由层
    Django简介
  • 原文地址:https://www.cnblogs.com/radical/p/3912389.html
Copyright © 2011-2022 走看看