poj 2100 尺取法 一个数字拆成连续数字平方和

题意:将一个数拆成若干个连续数字的平方和。

用尺取法枚举区间,复杂度为O(n),时限10s,3s多ac。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 #include <cmath>
 5 using namespace std;
 6
 7 const int N = 100;
 8
 9 struct Node
10 {
11     int from, to;
12 } node[N];
13
14 void solve( long long n )
15 {
16     int u = sqrt( n * 1.0 ), cnt = 0, q = 1;
17     long long sum = 0;
18     for ( int i = 1; i <= u; i++ )
19     {
20         sum += ( long long ) i * i;
21         while ( sum > n )
22         {
23             sum -= ( long long ) q * q;
24             q++;
25         }
26         if ( sum == n )
27         {
28             node[cnt].from = q;
29             node[cnt].to = i;
30             cnt++;
31         }
32     }
33     printf("%d\n", cnt);
34     for ( int i = 0; i < cnt; i++ )
35     {
36         printf("%d", node[i].to - node[i].from + 1);
37         for ( int j = node[i].from; j <= node[i].to; j++ )
38         {
39             printf(" %d", j);
40         }
41         puts("");
42     }
43 }
44
45 int main ()
46 {
47     long long n;
48     while ( scanf("%lld", &n) != EOF )
49     {
50         solve(n);
51     }
52     return 0;
53 }
时间: 2024-10-11 04:14:57

poj 2100 尺取法 一个数字拆成连续数字平方和的相关文章

poj 2100 尺取法(尺度法)

poj 2100 尺取法(尺度法) 题意 给你一个数N,然后找到一个连续的序列,使得这个序列中的数的平方和等于N. 输出需要注意的是第一行为解的个数,剩下的每行先输出序列的长度,然后输出序列.按照序列的长度进行降序输出. 解题思路 没啥好说的,使用尺度法,进行枚举各个区间上的数. 需要注意的是数字1的答案为: 1 1 1 代码实现 #include<cmath> #include<cstdio> #include<cstring> #include<algorit

poj 2100(尺取法)

Graveyard Design Time Limit: 10000MS   Memory Limit: 64000K Total Submissions: 6107   Accepted: 1444 Case Time Limit: 2000MS Description King George has recently decided that he would like to have a new design for the royal graveyard. The graveyard m

一个能将给定非负整数数组中的数字排列成最大数字的函数

最近在网上看到这样一个题目,自己琢磨了一下. java version "1.8.0_40" // 编写一个能将给定非负整数数组中的数字排列成最大数字的函数. // 例如,给定[50,2,1,9],最大数字为95021. public class Sort { public static void main(String args[]){ int number[] = {1,2,3,32,335,34,7,6,9}; int number1[] = {312,321,3354,222,

NFA转换成DFA——汉字形式数字转换成整数数字

偶然间遇到了一个需求:汉字形式数字转换成整数数字.如果不处理意外情况,可以写的很简单(比如不会出现三三等),详情可以看这里.但是,想着可以写成一个FA的形式,于是乎,发现并不是想象中的那么简单..因为写成FA就发现,要处理非法形式的问题,还是有点麻烦的. 好不容易写成了FA,发现是个NFA,于是乎写了个NFA转换成DFA的代码,也支持了一套简单的FA的定义规则.代码如下: package ie; import java.util.ArrayList; import java.util.HashM

POJ 3320 尺取法,Hash,map标记

1.POJ 3320 2.链接:http://poj.org/problem?id=3320 3.总结:尺取法,Hash,map标记 看书复习,p页书,一页有一个知识点,连续看求最少多少页看完所有知识点 必须说,STL够屌.. #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<algorithm> #include<cstdio>

POJ 2566(尺取法

自己看了半天并没有看出这题怎么用尺取法(虽然一看就觉得肯定是尺取法..),由于是绝对值,那么在计算的时候头和尾的实际位置并不重要,而应用尺取法这个数列肯定得是单调,那么我们把前缀和处理出来排序就可以直接应用尺取法了 #include<iostream> #include<cstdio> #include<algorithm> #include<queue> #include<utility> #include<vector> #inc

poj 3320 尺取法

容易联想到尺取法,因为假设从第s页开始阅读至少需要读到t页才能覆盖所有知识点的话,那么如果从s+1页开始阅读,至少要读到t'>=t的位置.于是可以考虑用map维护一下. 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 #include <map> 5 using namespace std; 6 7 const int INF = 1111111; 8 const int

poj 3061 尺取法或二分

经典尺取法,复杂度O(n). 1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 6 const int INF = 999999; 7 const int N = 100000; 8 int a[N]; 9 10 int main () 11 { 12 int t; 13 scanf("%d", &t); 14 whi

oracle数据库使用游标实现大写数字转换成小写数字

项目遇到需求,需要将大写数字转换成小写.代码如下: declare t_zl varchar2(100); t_ts varchar2(100); t_l number; hh varchar2(100); xx varchar2(100); type TIArray is table of varchar2(100);  type TCArray is table of varchar2(100); A TIArray;  B TCArray; cursor c is select zl,ts