zoukankan      html  css  js  c++  java
  • TOJ--3352--素数求和(双指针)

    换了个头像--ex 在hp的头像

    以作弥补~~

    这题 怎么说呢  我一开始以为是要进行搜索的 想了下 感觉 双重for就可以完事。。。

    然后 我的AC时间是大概700多ms  那边OJ最快的是15ms 。。。

    郁闷叻。。。。

                touch me

    题意很简单 就是给你一个正整数n 问你能不能用一连串的素数之和来表示   然后一共有几种表示方案...

    我不想介绍我那么 渣 的代码了~  = 我可以优化到30ms的时候 再来讲~

    先上下这 有待改善的 code

     1 #include <iostream>
     2 using namespace std;
     3 
     4 const int size = 10010;
     5 int prime[size];
     6 int cnt;
     7 
     8 bool judge( int x )
     9 {
    10     if( x==1 )
    11         return false;
    12     for( int i = 2 ; i*i<=x ; i++ )
    13     {
    14         if( x%i == 0 )
    15             return false;
    16     }
    17     return true;
    18 }
    19 
    20 void inital()
    21 {
    22     for( int i = 1 ; i<size ; i++ )
    23     {
    24         if( judge(i) )
    25             prime[cnt++] = i;
    26     }
    27 }
    28 
    29 int main()
    30 {
    31     int n;
    32     inital();
    33     int sum , value;
    34     cnt = 0;
    35     while( ~scanf("%d",&n) &&n )
    36     {
    37         sum = 0;
    38         for( int i = 0 ; prime[i]<=n ; i++ )
    39         {
    40             value = 0;
    41             for( int j = i ; prime[j]<=n ; j++ )
    42             {
    43                 value+=prime[j];
    44                 if( value>n )
    45                     break;
    46                 else if( value==n )
    47                 {
    48                     sum++;
    49                     break;
    50                 }
    51             }
    52         }
    53         printf( "%d
    ",sum );
    54     }
    55     return 0;
    56 }
    View Code

     OK 刚刚完成了一步优化~ 成功地将主函数中O(N^2)的时间复杂度 降低到 O(N )

    很深感触  就是 --指针 真的很灵活 又让我想起了 指针 与 引用  我的理解----指针 灵活性   引用  安全性( possiblely  it is wrong)

    我这边采用的方法是 使用2个指针 left 和 right 分别开始指向数组头  它们维护的区间是 [ left , right-1 ]

    这边做法 是基于 预处理完 1~10000区间内的素数后 并将素数存于一个prime数组后进行的操作

    其实 这个时候 这题 就转换成了 给你一个数组 寻找这个数字中 一串连续的数 使它的和 == n

    我觉得 这个方法 告诉你之后 其实手动模拟个数据 就不难了   我当时模拟了下 1 2 3 5 6 11(数组)----11(和)

    当你的value<n时 区间向右前进一格 由right++

    当你的value>=n时 区间最左边元素去掉 同时left++

    这边 值得一提的是 left == right 可以看成此时 该集合内无任何元素  *(right-1)即这个集合此时的最大元素

    over

    继续贴下代码 可能 我还会对素数的处理进行下优化 先去lol了~

     1 #include <iostream>
     2 using namespace std;
     3 
     4 const int size = 10010;
     5 int prime[size];
     6 int cnt;
     7 
     8 bool judge( int x )
     9 {
    10     if( x==1 )
    11         return false;
    12     for( int i = 2 ; i*i<=x ; i++ )
    13     {
    14         if( x%i == 0 )
    15             return false;
    16     }
    17     return true;
    18 }
    19 
    20 void inital()
    21 {
    22     prime[0] = 2;
    23     for( int i = 1 ; i<size ; i+=2 )
    24     {
    25         if( judge(i) )
    26             prime[cnt++] = i;
    27     }
    28 }
    29 
    30 int main()
    31 {
    32     int n; 
    33     cnt = 1;
    34     inital();
    35     int sum , value;
    36     int* left;
    37     int* right; 
    38     while( ~scanf("%d",&n) &&n )
    39     {
    40         value = sum = 0;
    41         left = prime;
    42         right = prime;
    43         while( left == right || *(right-1)<=n ) 
    44         {
    45             if( value<n )
    46             {
    47                 value+=*right;
    48                 right++;
    49             }
    50             else if( value>n )
    51             {   
    52                 value-=*left;
    53                 left++;
    54             }
    55             else if( value==n )
    56             {
    57                 sum++;
    58                 value-=*left;
    59                 left++;     
    60             }
    61         }
    62         printf( "%d
    ",sum );
    63     }
    64     return 0;
    65 }
    66 
    67 /*
    68 上面分开写 容易理解
    69 else if( value>=n )
    70 {
    71     value-=*left;
    72     left++;
    73     if( value==n )
    74         sum++;
    75 }
    76 */
    View Code

    但是 今天看到了一段很凄美的话~ 第一次介绍 来源: 一个--韩寒

    today:

      敢挑战的自己

      死在5岁时的幼儿园阿姨面前

      诚实的自己

      死在9岁的那次罚站之后

      勇敢的自己

      死在16岁时的地铁上

      想当艺术家的自己

      死在18岁时爸爸的责骂里

      相信爱情的自己

      死在19岁时学校附近的小旅馆床上

      觉得还有公平的自己

      死在21岁时的面试中

      骗自己说世上还有好男人的自己

      死在23岁时老板的汽车里

      27岁的许小姐真不知道

      这会有多少个自己 死在这一生的路上

    ---- 太悲观了~世界如此美好 值得我们为此奋斗

    ~~~   我相信后面这句---------

    just follow your heart
  • 相关阅读:
    vs2019 临时下载目录 离线安装 脱机安装
    直膝跳缓解腰椎间盘突出 腰疼 臀部肌肉疼痛
    fullscreen
    ubuntu 18.04 网络图标不见的问题解决方案
    采样率与比特率
    关于git的换行符问题
    在ASP.NET Core中使用EPPlus导入出Excel文件
    .net core 转 excel datatable list<t> 互转 xlsx
    .net core C# DataTable 和List之间相互转换的方法
    C# 的三种序列化方法
  • 原文地址:https://www.cnblogs.com/radical/p/3792651.html
Copyright © 2011-2022 走看看