poj-2140

来源:互联网 发布:linux创建文件目录 编辑:程序博客网 时间:2024/06/06 07:26

//132K110MSC++#include <cstring>#include <cstdio>using namespace std;int N;long long cnt;void solve(int N) {int begin = 1;int end = 1;long long sum = 1;while(1) {if (begin > N) {break;}// if (begin == N) {// if (sum == N) {// cnt++;// }// break;// }if (sum == N) {cnt++;sum -= begin;begin++;} else if (sum > N) {sum -= begin;begin++;} else if (sum < N) {if (end == N) {break;} else {end++;sum += end;}}}printf("%lld\n", cnt);}int main(){while(scanf("%d", &N) != EOF) {cnt = 0;solve(N);}return 0;}

类似于一个伸缩数组,begin 和 end代表当前被选取的数的范围, 同时维护一个sum来标示当前选择的数的大小,

如果对于某个数N:

如果 N== sum, 那么就是一种组合方案,先将beign+1,并从sum中减去 begin,

如果 N >  sum, 那么也是 begin前进一位, sum减去 begin

如果 N < sum, 那么 end前进一位, sum加上  end+1,

两种情况结束:

<1> sum < N. 但是 end已经到了 N(其实这种情况不可能出现)

<2> begin > N.

0 0