posts - 183,  comments - 10,  trackbacks - 0

求给定值的连续序列

例如给定值是 15
则有:
1 + 2 + 3 + 4 + 5 = 15
4 + 5 + 6 = 15
7 + 8 = 15

求解
设定一个区间 [left, right]
计算 left 到 right 之间的所有和 sum
若 sum 小于给定值 n 则 right 右移
若 sum 大于给定值 n 则 left 右移
若 sum 等于给定值 n 则 left 右移

[left, right] 的初始是 [1, 1]

另一个问题
求解一个集合中两个元素之和等于给定值
先对这个集合进行排序,然后从两端遍历,若和大于给定值则右边的标记左移,若和小于给定值则左边的值右移。

http://www.cppblog.com/jake1036/archive/2011/05/19/146745.html

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 
 5 int bar(int left, int right)
 6 {
 7     return (left + right) * (right - left + 1/ 2;
 8 }
 9 
10 void foo(vector<vector<int> >& result, int n)
11 {
12     result.clear();
13     int left = 1, right = 1;
14     int t;
15     while (left <= n / 2)
16     {
17         t = bar(left, right);
18         if (t < n)
19         {
20             ++right;
21         }
22         else if (t > n)
23         {
24             ++left;
25         }
26         else
27         {
28             vector<int> v;
29             for (int i = left; i <= right; ++i)
30             {
31                 v.push_back(i);
32             }
33             result.push_back(v);
34             ++left;
35         }
36     }
37 }
38 
39 int main()
40 {
41     int n;
42     vector<vector<int> > result;
43     while (cin >> n)
44     {
45         foo(result, n);
46         for (vector<vector<int> >::size_type i = 0; i != result.size(); ++i)
47         {
48             for (vector<int>::size_type j = 0; j != result[i].size(); ++j)
49             {
50                 cout << result[i][j] << ' ';
51             }
52             cout << endl;
53         }
54     }
55     return 0;
56 }


posted on 2011-07-23 16:23 unixfy 阅读(90) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理