pcfeng502

Brown's Space
 
 

常用链接

  • 我的随笔
  • 我的评论
  • 我参与的随笔

留言簿

  • 给我留言
  • 查看公开留言
  • 查看私人留言

随笔档案

  • 2010年10月 (1)
  • 2010年4月 (2)
  • 2009年11月 (3)
  • 2009年10月 (3)
  • 2009年9月 (3)
  • 2009年8月 (1)
  • 2009年7月 (1)

文章档案

  • 2009年5月 (1)

搜索

  •  

最新评论

  • 1. re: 求2的n次方的首数字
  • 写错了 是le-8
  • --baby
  • 2. re: 求2的n次方的首数字
  • int ans = (int) (pow(10.0, t-(double)y));
    取整的地方 +1e8
  • --baby

阅读排行榜

  • 1. poj 1042 -- Gone Fishing 枚举+贪心(1201)
  • 2. Poj 3370 Halloween treats(1168)
  • 3. 求2的n次方的首数字(989)
  • 4. poj 1442 Black box(927)
  • 5. C++ 标准库中函数所对应的头文件(转)(835)

评论排行榜

  • 1. 求2的n次方的首数字(2)
  • 2. C++ 标准库中函数所对应的头文件(转)(0)
  • 3. poj 1442 Black box(0)
  • 4. Poj 3370 Halloween treats(0)
  • 5. Poj 1597 – Uniform Generator 数论基础题(欢迎评论)(0)

Powered by: 博客园
模板提供:沪江博客
C++博客 | 首页 | 发新随笔 | 发新文章 | 联系 | 聚合 | 管理

2010年10月16日

2739 -- Sum of Consecutive Prime Numbers
    I haven't programming for years, so I decided to refresh it today. At least, this is the key point of CS&T, right?
    This problem is quite easy. It is easy to see that 2739 belongs to Number Theory. And key point lies on "consecutive"(If not, it'll be much harder:|). Since it requires that, and we only need to use the primes in [2,10000], it is easy to see that we can solve this in the following steps:
    1.Get all primes in [2,10000];
    2.Reset the counter to 0. Then, start from 2 and calculate the sums, namely, 2, 2+3, 2+3+5, ..., until the sum is great than 10000; for those who are less than that, increase the counter of that sum, correspondingly, 2,5,10,......
    3.For each input between 2 and 10000, output the precalculated sum.
Source code as followed:
#include <iostream>
#include 
<cmath>

using namespace std;
const int MAXN = 10000;
bool f[MAXN+10];
int np;
int p[MAXN+10];
int sum[MAXN+10];


void findPrime() {
    memset(f, 
1, sizeof(f));
    f[
0] = 0; f[1] = 0;//doesn't matter anyway
    int tmp = abs(sqrt(MAXN*1.0));
    
for (int i = 2; i <= tmp; i++) {
        
if (f[i]) {
            
for (int j = i+i; j <= MAXN; j+=i)
                f[j] 
= 0; //false
        }
    }
    
int ctr = 0;
    
for (int i = 2; i <= MAXN; i++)
        
if (f[i]) {
            p[ctr
++] = i;
        }
    np 
= ctr;
}

void geneSum() {
    memset(sum, 
0, sizeof(sum));
    
    
for (int i = 0; i < np; i++) {
        
int tsum = 0;
        
for (int j = i; j < np; j++) {
            tsum 
+= p[j];
            
if (tsum > MAXN) break;
            sum[tsum]
++;
        }
    }
}

void initi() {
    findPrime();
    geneSum();
}

int main() {
    initi();
    
int n;
    
while (1) {
        scanf(
"%d", &n);
        
if (n == 0) break;
        printf(
"%d\n", sum[n]);
    }
    
return 0;
}

posted @ 2010-10-16 21:08 ACM Fighter! 阅读(381) | 评论 (0) | 编辑 收藏
 

2010年4月27日

Recover My Files; data recovery
Recover My files is a very good software. Easy 2 use and can recover the deleted and unindexed files.
posted @ 2010-04-27 23:52 ACM Fighter! 阅读(137) | 评论 (0) | 编辑 收藏
 

2010年4月13日

[转]常用图像空域滤波技术

      空域滤波技术根据功能主要分为平滑滤波与锐化滤波,平滑滤波能减弱或消除图像中的高频率分量而不影响低频分量。因为高频分量对应图像中的区域边缘等灰度值 具有较大变化的部分,平滑滤波可将这些分量滤去减少局部灰度起伏,是图像变得比较平滑。实际应用中,平滑滤波还可用于消除噪声,或在提取较大目标前去除太 小的细节或将目标的小间断连接起来。锐化滤波正好相反,实际应用中锐化滤波常用于增强被模糊的细节或目标的边缘。

      空域滤波是在图像空间通过邻域操作完成的,实现的方式基本都是利用模板(窗)进行卷积来进行,实现的基本步骤为:

      1、将模板中心与图中某个像素位置重合;

      2、将模板的各个系数与模板下各对应像素的灰度值相乘;

      3、将所有乘积相加,再除以模板的系数个数;

      4、将上述运算结果赋给图中对应模板中心位置的像素。

    

      常见的空域滤波器:

      1、邻域平均:将一个像素邻域平均值作为滤波结果,此时滤波器模板的所有系数都取为1。

      2、加权平均:对同一尺寸的模板,可对不同位置的系数采用不同的数值。实际应用中,常取模板周边最小的系数为1,而取内部的系数成比例增加,中心系数最 大。

           加权平均模板示例:

                                                1     2     1

                                                2     4     2

                                                1     2     1

      3、高斯分布:借助杨辉三角对高斯函数进行近似。

           高斯模板系数:

                                                    1

                                                 1    1

                                              1    2    1    

                                           1    3    3    1

                                        1    4    6    4    1

                                     1    5    10  10    5    1 

      4、中值滤波:中值滤波是一种非线性滤波方式,可用如下步骤完成。

          (1)将模板在图中漫游,并将模板中心与图中某个像素位置重合;

          (2)读取模板下各对应像素的灰度值;

          (3)将这些灰度值从小到大进行排序;

          (4)找出中间值并赋给对应模板中心位置的像素。

          一般情况下中值滤波的效果要比邻域平均处理的低通滤波效果好,主要特点是滤波后图像中的轮廓比较清晰。

      5、最频值滤波:通过直方图统计中心像素点的灰度分布情况,将出现次数最多的灰度值(即直方图波峰位置)赋给中心位置的像素。如果直方图是对称的且仅有一 个峰,那么均值、中值和最频值相同。如果直方图仅有一个波峰但不对称,那么最频值对应波峰,而中值总比均值更接近最频值。

      6、锐化滤波:图像锐化一般是通过微分运算来实现的,图像处理中最常用的微分方法是利用梯度(基于一阶微分)。在离散空间,微分用差分实现,常用的差分模板如下:

                            -1        1                           1   1   1

                            -1        1                          

                            -1        1                          -1  -1 -1
posted @ 2010-04-13 17:17 ACM Fighter! 阅读(511) | 评论 (0) | 编辑 收藏
 

2009年11月17日

NOCOW - USACO/ S3.1 Stamps
一道简单的动态规划,可以先写出递归方程(注意到每一总票值都是由比它小的票值产生的),然后通过其求解。


用F[i]表示得到i面值所需要的最少邮票个数,Value[j](j=1..Stamps)表示每个邮票的面值,可得以下转移方程:

F[i]=Min ( F[i-Value[j]] + 1 ) (i-Value[j]>=0 j=1..Stamps)
初始状态:F[0]=0;F[i]=INFINITE;


posted @ 2009-11-17 21:44 ACM Fighter! 阅读(476) | 评论 (0) | 编辑 收藏
 

2009年11月10日

poj 2159 水题
题目中Substitution method的意思是如下:
Substitutes for all letters must be different. For some letters substitute letter may coincide with the original letter.
相当于一个映射,而不能片面的理解成移位的意思。前面就是因为这个wa的……

注意读题,不要被水题水了。
posted @ 2009-11-10 23:28 ACM Fighter! 阅读(529) | 评论 (0) | 编辑 收藏
 
getline(cin,s)
while (getline(cin,s)) {
    // TO DO PROGRAM HERE
}

posted @ 2009-11-10 17:34 ACM Fighter! 阅读(191) | 评论 (0) | 编辑 收藏
 

2009年10月21日

Poj 1597 – Uniform Generator 数论基础题(欢迎评论)

Poj 1597 – Uniform Generator



 

题目的意思就是一个生成随机数的函数,

     Seed[x+1] = ( seed[x] + STEP ) % MOD

其中seed就是我们生成出来的随机数,至于seed[0]是哪个数并不重要,后面会证明。STEP就是我们每次往前一个所加的值,再module上MOD得到下一个随机数。

 

判断这个随机生成函数的好坏的依据是如果能够产生0~MOD-1内的所有数,就是一个好的,否则坏。

 

我们知道了同余的特性,便可以假设在k步之后,生成的seed[k] = seed[0],所以由此有

        Seed[k] = ( seed[0] + STEP*k ) % MOD

那么,

        STEP * k = MOD

 

而我们如果要生产MOD个数,必须使k≥MOD,而且k不可能大于MOD,因为这个条件下生成的数又开始重复,所以k=MOD;在前面的条件下,如果STEP和MOD有大于1的公约数例如d,那么会有STEP*(k/d) = MOD,这就是一个循环了,只会产生k/d<MOD个随机数。

结论:iff gcd(STEP, MOD) == 1, good choice.

posted @ 2009-10-21 21:33 ACM Fighter! 阅读(628) | 评论 (0) | 编辑 收藏
 

2009年10月18日

Poj 3370 Halloween treats

Poj 3370 Halloween treats

这道题在集训手册上标志是“抽屉原理”,老实说,在看到这道题的具体解法之前,我还不知道为什么是抽屉原理,这明明是判断一些数的同余嘛,后来才发现鸽笼原理的巧妙之处。

 

4 5

1 2 3 7 5

 

例如对于第一组数据,

1 2 3 7 5模上4分别是:

1 2 3 3 1

如果采用同余+dp的方法,难度会相当大,规则比较复杂;

 

这时,我们采用一种巧妙地方法,就是用一个sum[i]数组来记录前i个数之和%4,例如上例中,我们得到:

I

0(该列隐含)

1

2

3

4

5

Sweet[i]

0

1

2

3

7

5

Sum[i]

0

1

3

2

1

2

 

由此,我们在碰到1.sum[i] == 0 或者2.sum[i]的值已经在前面出现过的情况时,就可以知道有解,并且解是从上一个出现该sum[i]数值的后一个位置开始→现在sum[i]的位置,这个貌似可以解出可能的解;但由于加和的顺序随机,所以还不清楚是否可以在该case有解的情况下一定能够解出解。这时候,我们就要用到鸽笼原理了。

 

运用《离散数学与组合数学》书中的方法,我们可以把sum[1~n=nneighbor](或0~n)看做n+1只鸽子(注意上面的隐含0列),飞入c=nchild个鸽笼中,再注意到题目中有这样的数据范围:

The first line of each test case contains two integers c and n (1 ≤ c ≤ n ≤ 100000) (这是本题能用鸽笼原理的最重要的前提)

由此我们可以知道一定有两只鸽子是飞入同一个笼子当中的,所以加法的顺序就自然不用考虑了;而且由这个我们也可以知道,此题一定不存在无解的情况。

代码就不贴了,数学题还是要自己想才好

 

posted @ 2009-10-18 22:26 ACM Fighter! 阅读(1168) | 评论 (0) | 编辑 收藏
 

2009年10月5日

poj 1442 Black box
读题读得有点累,不过最后还是看懂了。意思就是给定一组数据按顺序插入,每次在u个元素的时候

(本例中(后略)是1,2,6,6),
找到第i小的数,i= 1,2,3,4...,correspondly,相对应的。

开始用线性表做,TLE了,没注意到查询是线性的……
后来看了参考了别人的solutions,发现了stl中的一个好东东,priority_queue

priority_queue的功能和用法可以看下 C++ STL

至于解题报告嘛,由于我也是参考别人写的代码,所以就不东施效颦了,贴一下:
http://www.stubc.com/thread-3511-1-2.html(这篇分析选用哪个数据结构思路比较好)
http://hi.baidu.com/leisimeng/blog/item/2a307e6110f394d78db10d02.html

P.S. 在代码中间加了一些注释,希望会有一些帮助。


 1 #include <iostream>
 2 #include <queue>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 int M, N;
 7 int a[30010], u[30010];
 8 
 9 int main() {
10 #ifdef _DEBUG
11     freopen("in.txt", "r", stdin);
12     freopen("out.txt", "w", stdout);
13 #endif
14     int i, j, value;
15     while (scanf("%d %d", &M, &N) != EOF) {
16         // 左边大根堆,右边小根堆 
17         // 这样,当我们把它们看作一体时,可以保证它的有序性 
18         priority_queue< int, vector<int>, less<int> > hmax;
19         priority_queue< int, vector<int>, greater<int> > hmin;
20         
21         for (i = 0; i < M; i++)
22             scanf("%d", &a[i]);
23 
24         u[0] = 0;
25         for (i = 1; i <= N; i++)
26             scanf("%d", &u[i]);
27             
28         for (i = 1; i <= N; i++) {
29             
30             // inserting a+ 0 to 1, 1 to 2, 2 to 6, 6 to 6 according to i
31             for (j = u[i-1]; j < u[i]; j++) {
32                 hmax.push(a[j]);
33                 /* we want to get the i-th smallest number, so when
34                  * we reach i(in the big-root heap), the excessive(for
35                  * ive(for now) must be in the small-root heap so that
36                  * we could sort it and might use it later
37                  */
38                 if (hmax.size() > i-1) {
39                     value = hmax.top();
40                     hmax.pop();
41                     hmin.push(value);
42                 }
43             }
44             // after the loop, the answer is the root of the small-r heap
45             value = hmin.top();
46             hmin.pop();
47             hmax.push(value);
48             printf("%d\n", hmax.top());
49         }
50     }
51 }
52 

posted @ 2009-10-05 12:31 ACM Fighter! 阅读(927) | 评论 (0) | 编辑 收藏
 

2009年9月20日

求2的n次方的首数字
设2^n为x, 设x为10^y次方级的数(用科学计数法表示的后缀),要求的首位为f

那么
             lg(x/10^y) = lg(f)         lg是底为10的对数
上式可以变为  lg(x) - y = lg(f)
       ==>  n*lg(2) - y = lg(f)

现在,只用求y即可,
其实, (int) y = lg(x) = lg(2^n) = n*lg(2),
看起来不是跟上一个相等吗?但是注意y展开后是100000...的形式,所以我们在求出了它的对数之后,只取它的整数部分即可,即y是int型,所以……后面的不用推了,把f外面的对数符号拿过去就是了。

最后得到:
            f = 10^(n*lg(2)- (int)(n*lg(2)))

同样的,如果要求3、4、5...的n次方,只需要把2改为它们即可


P.S. 不过此算法在算2的3次方时会有误差,还不清楚为什么?(准确地说,在幂n小的时候都有误差)想请教一下各位大牛,谢谢啦~

#include <iostream>
#include <cmath>

using namespace std;

int main() {
    int n;
    while (scanf("%d", &n) && n!=-1) {
        int y = (int) (n * log10(2.0));
        double t = n * log10(2.0);
        int ans = (int) (pow(10.0, t-(double)y) + 1e-8);
        //n == 2 答案有误差,在加上1e-8后,误差消除
        printf("%d\n", ans);
    }
    return 0;
}



posted @ 2009-09-20 23:46 ACM Fighter! 阅读(989) | 评论 (2) | 编辑 收藏
 
仅列出标题  下一页