「Luogu2765」[网络流24题] 魔术球问题

->戳我进原题

[网络流24题] 魔术球问题



时空限制:1000ms / 128MB


问题描述

假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为1,2,3,...的球。
(1)每次只能在某根柱子的最上面放球。
(2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数。
试设计一个算法,计算出在n根柱子上最多能放多少个球。例如,在4 根柱子上最多可放11 个球。

编程任务

对于给定的n,计算在n根柱子上最多能放多少个球。

输入格式

第1 行有1个正整数n,表示柱子数。

输出格式

程序运行结束时,将n 根柱子上最多能放的球数以及相应的放置方案输出。文件的第一行是球数。接下来的n行,每行是一根柱子上的球的编号。

输入样例

4

输出样例

11
1 8
2 7 9
3 6 10
4 5 11

说明

4<=n<=55

分析

魔术球问题 网络流的经典例题

然而本蒟蒻并不会写网络流做法

所以今天我向大家介绍一种较为朴素的做法 贪心

本题的数据给的\(55\) 所以我们尽可以写O\(3\) O\(4\)算法

于是我便有了贪心的念头

查看本题题意不难发现 为了使柱子尽可能填满且尽可能多填数

可以把本题分为两种操作

(1)如果当前柱子有可以放置使前后成为平方数的位置 则放置

(2)如果当前没有可放置位置 开一个新柱子 将该球放到新柱子的第一项

这样我们就可以贪心辣~ 但是我们有几个地方需要注意

a要注意边界是柱子开到n个 如果不判边界会使程序进入死循环

b由于球号是自增的 所以在输出最大球号是要输出最后判断停止的球号-1

c在循环判断放球的时候可以找到位置立刻break 这样可以达到一个剪枝的效果

好辣 看到这里有没有觉得其实这个题很简单呢

我建议你们自己写写 如果还写不出来的话再看下面的完整代码

代码

#include<cstdio>
#include<cctype>
#include<cmath>
#define rg register
using namespace std;
const int N =56;
int f[N][10001],ball,book[N];//book来存每一个柱子有几个数
int n,cnt=1,spot;
inline int read(){
    rg int f=0,x=0;
    rg char ch=getchar();
    while(!isdigit(ch)) f|=(ch=='-'),ch=getchar();
    while(isdigit(ch))  x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return f?-x:x;
}
inline bool jud(rg int x){//判断是否为平方数
    rg int i=(int)sqrt(x);
    if(i*i==x)  return true;
    else    return false;
}
signed main(){
    n=read();
    while(cnt<=n){
        ball++;
        spot=0;
        for(rg int i=1; i<=cnt; ++i){
            if(jud(ball+f[i][book[i]])){//如果能找到
                book[i]++;
                f[i][book[i]]=ball;
                break;
            }
            spot++;//每找一个循环都标记一下
        }
        if(spot==cnt){//走完所有循环都没找到
            cnt++;
            f[cnt][1]=ball;
            book[cnt]=1;
        }
    }
    printf("%d\n",ball-1);//一定要-1!!
    for(rg int i=1; i<cnt; ++i){//i<cnt是因为现在的cnt是多出来的一个ball
        for(rg int j=1; j<=book[i]; ++j)
            printf("%d ",f[i][j]);
        printf("\n");
    }
    return 0;
}

后话

当然网络流还有其它的题可以拿诸如此类的贪心做

既然分在了网络流大家最好还是要尝试一下网络流的做法

不要浪费每一道好题

原文地址:https://www.cnblogs.com/horrigue/p/9618379.html

时间: 2024-08-07 18:02:48

「Luogu2765」[网络流24题] 魔术球问题的相关文章

[网络流24题]魔术球问题

问题描述: 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为 1,2,3,4......的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在n根柱子上最多能放多少个球.例如,在4 根柱子上最多可放11个球. ´编程任务: 对于给定的n,计算在 n根柱子上最多能放多少个球. ´数据输入: 文件第1 行有 1个正整数n,表示柱子数. ´结果输出: 文件的第一行是球数. 数据规模 n<=60  保证答案小于16

网络流24题——魔术球问题 luogu 2765

题目描述:这里 这道题是网络流问题中第一个难点,也是一个很重要的问题 如果直接建图感觉无从下手,因为如果不知道放几个球我就无法得知该如何建图(这是很显然的,比如我知道$1+48=49=7^2$,可是我都不知道是否能放到第48个球,那我怎么知道如何建边呢?) 所以这时就体现出了一个很重要的想法:枚举答案!!! 我们知道,正常有二分答案的做法,可以二分一个答案然后检验 这里用类似的想法,但由于答案比较小而且建图更方便,所以我们直接从小往大枚举答案即可 之所以建图更方便,是因为如果我们从小向大枚举答案

LiberOJ 6003. 「网络流 24 题」魔术球 贪心或者最小路径覆盖

6003. 「网络流 24 题」魔术球 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 假设有 n nn 根柱子,现要按下述规则在这 n nn 根柱子中依次放入编号为 1,2,3,4,? 1, 2, 3, 4, \cdots1,2,3,4,? 的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何 2 22 个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在 

[loj #6003]「网络流 24 题」魔术球 二分图最小路径覆盖,网络流

#6003. 「网络流 24 题」魔术球 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 假设有 n nn 根柱子,现要按下述规则在这 n nn 根柱子中依次放入编号为 1,2,3,4,? 1, 2, 3, 4, \cdots1,2,3,4,? 的球. 每次只能在某根柱子的最上面放球. 在同一根柱子中,任何 2 22 个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在

「网络流24题」 题目列表

「网络流24题」 题目列表 序号 题目标题 模型 题解 1 飞行员配对方案问题 二分图最大匹配 <1> 2 太空飞行计划问题 最大权闭合子图 <2> 3 最小路径覆盖问题 二分图最小路径覆盖 <3> 4 魔术球问题 <4> 5 圆桌问题 <5> 6 最长递增子序列问题 <6> 7 试题库问题 <7> 8 机器人路径规划问题 <8> 9 方格取数问题 二分图最大点权独立集 <9> 10 餐巾计划问题

【网络流24题】魔术球问题

P1226 - [网络流24题]魔术球问题 Description 假设有n根柱子,现要按下述规则在这n根柱子中依次放入编号为 1,2,3,4......的球. (1)每次只能在某根柱子的最上面放球. (2)在同一根柱子中,任何2个相邻球的编号之和为完全平方数. 试设计一个算法,计算出在n根柱子上最多能放多少个球.例如,在4 根柱子上最多可 放11个球. ′编程任务: 对于给定的n,计算在 n根柱子上最多能放多少个球. Input 第1 行有 1个正整数n,表示柱子数. Output 第一行是球

LibreOJ #6001. 「网络流 24 题」太空飞行计划 最大权闭合图

#6001. 「网络流 24 题」太空飞行计划 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:Special Judge 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 W 教授正在为国家航天中心计划一系列的太空飞行.每次太空飞行可进行一系列商业性实验而获取利润.现已确定了一个可供选择的实验集合 E={E1,E2,?,Em} E = \{ E_1, E_2, \cdots, E_m \}E={E?1??,E?2??,?,E?m??},和进行这些实验

LiberOJ #6013. 「网络流 24 题」负载平衡 最小费用最大流 供应平衡问题

#6013. 「网络流 24 题」负载平衡 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 G 公司有 n nn 个沿铁路运输线环形排列的仓库,每个仓库存储的货物数量不等.如何用最少搬运量可以使 n nn 个仓库的库存数量相同.搬运货物时,只能在相邻的仓库之间搬运. 输入格式 文件的第 1 11 行中有 1 11 个正整数 n nn,表示有 n nn 个仓库.第 2 22 行中有 n nn 个

LiberOJ #6000. 「网络流 24 题」搭配飞行员 最大匹配

#6000. 「网络流 24 题」搭配飞行员 内存限制:256 MiB时间限制:1000 ms标准输入输出 题目类型:传统评测方式:文本比较 上传者: 匿名 提交提交记录统计讨论测试数据 题目描述 飞行大队有若干个来自各地的驾驶员,专门驾驶一种型号的飞机,这种飞机每架有两个驾驶员,需一个正驾驶员和一个副驾驶员.由于种种原因,例如相互配合的问题,有些驾驶员不能在同一架飞机上飞行,问如何搭配驾驶员才能使出航的飞机最多. 因为驾驶工作分工严格,两个正驾驶员或两个副驾驶员都不能同机飞行. 输入格式 第一