sicily 1218纪念邮票

题意要求为输入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;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值