POJ 2100 Graveyard Design 尺取法

这篇具有很好参考价值的文章主要介绍了POJ 2100 Graveyard Design 尺取法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、题目大意

给出一个数字num,1<=num<=1e14,找出连续的数字 ai,ai+1...aj使得每一项取平方最后求和等于num,题目要求排列的数字,和排列的个数,输出出来

二、解题思路

因为是平方求和,那么我们只需要计算1e7以内的数字就可以,case time limie 2000ms,简单考虑下尺取法最合适,O(n)复杂性,1e7的数组,时间上可以过。

思路如下:

初始化left和right为1,n为 10000007 (加7是为了安心),sum为0
1、当sum<num且right<n时,不断的给sum加上right的平方,然后right自增
2、如果1结束后,sum<num,程序结束
3、判断下sum和num是否相等,相等的话,记录下一组解(用vector记录简单)
4、sum减去left的平方,left自增

这个记录解的过程,可以用vector,每次找到了解,把right-left+1作为数字的数量,放在新的vector里,然后把[left,right]的闭区间内的数字都放在vector里面,再把这个vector放在大vector里就行

尺取法的left只能越来越大。所以记录解的过程就是按left递增去排序的,不需要对vector做排序

需要注意的是本题目需要开long long文章来源地址https://www.toymoban.com/news/detail-705008.html

三、代码

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
typedef long long ll;
ll n = 10000007, num;
vector<vector<ll>> ansVector;
void output()
{
    printf("%d\n", ansVector.size());
    for (int i = 0; i < ansVector.size(); i++)
    {
        for (int j = 0; j < ansVector[i].size(); j++)
        {
            if (j + 1 == ansVector[i].size())
            {
                printf("%d\n", ansVector[i][j]);
            }
            else
            {
                printf("%d ", ansVector[i][j]);
            }
        }
    }
}
void saveAns(ll left, ll right)
{
    vector<ll> currentVector;
    currentVector.push_back(right - left + 1);
    for (ll i = left; i <= right; i++)
    {
        currentVector.push_back(i);
    }
    ansVector.push_back(currentVector);
}
void solve()
{
    ll left = 1, right = 1, sum = 0;
    while (true)
    {
        while (sum < num && right < n)
        {
            sum += (right * right);
            right++;
        }
        if (sum < num)
        {
            break;
        }
        else if (sum == num)
        {
            saveAns(left, right - 1);
        }
        sum -= (left * left);
        left++;
    }
    output();
}
int main()
{
    while (~scanf("%lld", &num))
    {
        ansVector.clear();
        solve();
    }
    return 0;
}

到了这里,关于POJ 2100 Graveyard Design 尺取法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 尺取法 学习笔记

    尺取法,简单来说是一种利用 双指针法 遍历满足条件的 区间 的算法。 其算法思想为:对数组保存⼀对下标,即所选取的区间的左右端点,然后根据实际情况不断地推进区间左右端点以得出答案。 尺取法不会去枚举到一定不满足条件的区间,所以是一种 ⾼效的枚举

    2024年02月08日
    浏览(21)
  • 蓝桥杯刷题016——最大子矩阵(尺取法+单调队列)

    题目来源:最大子矩阵 - 蓝桥云课 (lanqiao.cn) 问题描述 小明有一个大小为 N×M 的矩阵, 可以理解为一个 N 行 M 列的二维数组。 我们定义一个矩阵 m 的 稳定度 f(m)  为 f(m)=max(m)−min(m) , 其中 max(m) 表示矩阵 m 中的最大值, min(m) 表示矩阵 m 中的最小值。 现在小明想要从

    2023年04月16日
    浏览(25)
  • 小米AC2100刷OpenWrt(避免踩坑)

    本来是想弄一个迷你工控机刷OpenWrt玩一下, 碍于囊中羞涩,又翻出之前没有刷成功的小米AC2100 一直卡在Breed web 恢复控制台,不管怎么刷都重启就是见不到熟悉的OpenWrt 一次偶然的发现一个刷机留言说,说刷成功了,在选择OpenWrt 我才开始怀疑是我的Breed web 恢复控制台的版本

    2024年02月14日
    浏览(121)
  • 杭电oj Simple Set Problem 双指针 尺取法 满注释版

    👨‍🏫 题目地址 输入 输出 使用快读,避免使用 Arrays.fill() 按需初始化 避免卡常 🍑 思路

    2024年02月15日
    浏览(23)
  • 最新AI绘画矢量笔刷2100款大合集,支持AI2022版本

    AI绘画矢量笔刷2100款大合集,绘画设计优质素材! 支持AICS6-2022,基本上这一套也够用了   素材有点大,也有预览图,按需使用,防和谐打包了一下 备份(不限速下载):分秒帧 影音协作 从此无界

    2024年02月13日
    浏览(29)
  • 红米AC2100刷openwrt以及刷回官方固件全记录

    访问openwrt官网,我们可以知道一些路由器有漏洞,可以刷openwrt固件,做一些自定义操作。 我刷openwrt的目的主要是用tc脚本限速,因为我发现路由器本身的限速功能似乎有问题,并不能如你所期地进行限速。 刷机就是替换原厂的固件, 刷机包括刷boot和刷系统 ,boot类似于p

    2024年02月09日
    浏览(33)
  • POJ 2456 Aggressive cows 二分搜素

    对两头牛之间的最大间距进行二分,在judge函数里不断的用lower_bound去寻找当前牛的下一头牛放置的最近位置,最后判断能否放下c头牛,可以的话left=mid,否则right=mid,最终输出left

    2024年02月10日
    浏览(21)
  • 先正达将在科创板上会:拟募资650亿元,预计全年收入超2100亿元

    3月15日,先正达集团股份有限公司(下称“先正达”)在上海证券交易所递交招股书(上会稿)。这意味着,先正达将于近期上会,接受科创板上市委员会的现场审议。据贝多财经了解,先正达于2021年6月在科创板递交招股书。 本次冲刺科创板上市,先正达计划募资650亿元,

    2024年02月05日
    浏览(25)
  • 挑战程序设计竞赛 2.2 poj 3040 Allowance 贪心

    https://vjudge.csgrandeur.cn/problem/POJ-3040 解答 直觉分析如下: 因为可选择的美分硬币数值是可整除的。所以我们需要尽量选择面额更大的硬币. 1 因为面值小的硬币总能替代面额大的硬币,更优。所以我们选择次优的较大面额的硬币,将更优的选择留给后面。 2 同样的 凑齐刚好等

    2024年02月08日
    浏览(31)
  • POJ - 2282 The Counting Problem(数位DP 计数问题)

    Given two integers a and b, we write the numbers between a and b, inclusive, in a list. Your task is to calculate the number of occurrences of each digit. For example, if a = 1024 a = 1024 a = 1024 and b = 1032 b = 1032 b = 1032 , the list will be 1024 1024 1024 1025 1025 1025 1026 1026 1026 1027 1027 1027 1028 1028 1028 1029 1029 1029 1030 1030 1030 1031 10

    2023年04月17日
    浏览(23)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包