您的位置:首页 > 其它

sicily 1218纪念邮票

2013-12-26 23:57 253 查看
题意要求为输入n,m两个数,求解在1-n内满足连续和为m的区间。

设区间的端点为a,b。我觉得亮点一是利用c=b-a,这样可以将循环从两个变成一个,时间复杂度大大减小。亮点二是使用了STL库中的map,将结果储存在map中,然后输出。

for循环中判断条件是最重要的,其他很简单了。

#include<stdio.h>
#include<map>
using namespace std;
int main() {
int n, m, c, a;
map<int, int>stamp;
map<int, int>::iterator it;
scanf("%d %d", &n, &m); // 因为c=b-a,[a,b]区间的和为(b-a+1)(b+a)/2 = m即为(2a+c)(c+1)=2m
for (c = 0 ; c * c < 2 * m ; c++) {
if (2 * m % (c + 1) == 0 // 保证a为整数
&& 2 * m / (c + 1) - c != 0 // 保证a不为0
&& ((2 * m)/ (c+1) - c ) % 2 == 0) {  // 保证2*a是偶数
a = (2 * m / (c + 1) - c) / 2;
if (a + c <= n)
stamp.insert(pair<int, int>(a, a+c));
}

}
for (it = stamp.begin() ; it != stamp.end() ; it++) {
printf("[%d,%d]\n", it->first, it->second);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: