Greedy:Graveyard Design(POJ 2100)

本文介绍了一种通过游标卡尺法寻找特定整数的所有可能平方和组合的方法。使用C++实现,该方法能够在不消耗过多内存的情况下找到所有有效的平方数组合。

              

               墓地

  题目大意,给定一个整数,要你找出他的平方和组合

  太简单了。。。。不过一开始我储存平方和想降低时间,后来发现会超内存,直接用时间换空间了,游标卡尺法

  

 1 #include <iostream>
 2 #include <functional>
 3 #include <algorithm>
 4 #define MAX_N 10000001
 5 
 6 using namespace std;
 7 typedef long long LL_INT; 
 8 
 9 static int store[MAX_N][2];//只储存开始和结尾
10 
11 void Inivilize(void);
12 
13 int main(void)
14 {
15     LL_INT n, sum, tmp;
16     int    s, t, num;
17 
18     while (~scanf("%lld", &n))
19     {
20         sum = num = 0; s = t = 1;
21         while (1)
22         {
23             while ((tmp = (LL_INT)t*(LL_INT)t) <= n && sum < n)
24             {
25                 sum += tmp;
26                 t++;
27             }
28             if (sum == n)
29             {
30                 store[num][0] = s; store[num][1] = t;
31                 num++;
32             }
33             if (sum < n)
34                 break;
35             sum -= (LL_INT)s*(LL_INT)s; s++;
36         }
37         printf("%d\n", num);
38         for (int i = 0; i < num; i++)
39         {
40             printf("%d ", store[i][1] - store[i][0]);
41             for (int j = store[i][0]; j < store[i][1]; j++)
42                 printf("%d ", j);
43             printf("\n");
44         }
45     }
46     return EXIT_SUCCESS;
47 }

  

转载于:https://www.cnblogs.com/Philip-Tell-Truth/p/5155131.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值