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
原文地址:https://www.cnblogs.com/radical/p/3792651.html