<饮水入城> (神坑爆搜)

<饮水入城> (神坑爆搜)

题目描述

在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠。该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度。

这里写图片描述

为了使居民们都尽可能饮用到清澈的湖水,现在要在某些城市建造水利设施。水利设施有两种,分别为蓄水厂和输水站。蓄水厂的功能是利用水泵将湖泊中的水抽取到所在城市的蓄水池中。

因此,只有与湖泊毗邻的第1 行的城市可以建造蓄水厂。而输水站的功能则是通过输水管线利用高度落差,将湖水从高处向低处输送。故一座城市能建造输水站的前提,是存在比它海拔更高且拥有公共边的相邻城市,已经建有水利设施。由于第N 行的城市靠近沙漠,是该国的干旱区,所以要求其中的每座城市都建有水利设施。那么,这个要求能否满足呢?如果能,请计算最少建造几个蓄水厂;如果不能,求干旱区中不可能建有水利设施的城市数目。
输入输出格式
输入格式:

输入文件的每行中两个数之间用一个空格隔开。输入的第一行是两个正整数N 和M,表示矩形的规模。接下来N 行,每行M 个正整数,依次代表每座城市的海拔高度。

输出格式:

输出有两行。如果能满足要求,输出的第一行是整数1,第二行是一个整数,代表最少建造几个蓄水厂;如果不能满足要求,输出的第一行是整数0,第二行是一个整数,代表有几座干旱区中的城市不可能建有水利设施。

输入输出样例
输入样例#1:

【输入样例1】
2 5
9 1 5 4 3
8 7 6 1 2

【输入样例2】
3 6
8 4 5 6 4 4
7 3 4 3 3 3
3 2 2 1 1 2

输出样例#1:

【输出样例1】
1
1

【输出样例2】
1
3

说明
这里写图片描述

【样例1 说明】

只需要在海拔为9 的那座城市中建造蓄水厂,即可满足要求。

【样例2 说明】

上图中,在3 个粗线框出的城市中建造蓄水厂,可以满足要求。以这3 个蓄水厂为源头

在干旱区中建造的输水站分别用3 种颜色标出。当然,建造方法可能不唯一。

数据范围
这里写图片描述

  • 先平复一下激动的心情,毕竟这题本蒟篛wa了40多天。。。
  • 这个题其实就是洪水漫延的升级版,所以不算难,比较难写而已;
  • 当然也有难点
    1. 思路:若最后一行的点全会被水覆盖,则从第一行的某个点引出的水所能覆盖的最后一行的区间一定是连续的。比如不可能覆盖最后一行的[2,5],[7,9]两个断开的区间。
    证明:(反证) 如果区间断开,则意味着能连向中间断开部分的某个点的点都无法将水运送给它(高度低),所以第一行其它点引出的水也无法到达这个点,这个点就永远不会有水;
    2. 搜索既可以写dfs,也可以写bfs。但是两种写法都有很多坑;
    搜索的目的有两个,判断最后一行是否都能覆盖,以及从第一行的某个点引出的水所能覆盖的最后一行的区间;
    3. 最后有一个区间覆盖问题:利用之前搜索得出的第一行每个点所能覆盖的区间,将问题转化为n段区间覆盖n个点所需的最小区间数,运用DP或贪心解决;
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#define For(i,n) for(int i=1;i<=n;++i)
using namespace std;
int n,m;    //N 行,每行M 个正整数
int h[510][510];
bool e[510][510],dry[510];
int lft[510],rgt[510];//初始化
int sum;

void init();
void bfs(int,int);
void DP();

int main(){
    init();
    if(n==1){
        printf("%d\n",1);
        For(i,m) 
         if(h[1][i]>=h[1][i-1]&&h[1][i]>=h[1][i+1])
          sum++;
        printf("%d",sum);
        return 0;
    }
    memset(lft,0x3f3f3f3f,sizeof(lft));
    For(i,m)
     if(h[1][i]>=h[1][i-1]&&h[1][i]>=h[1][i+1]){//剪枝(只有左右端点的高度都比这个点的高度小,才需要搜)
        //cout<<i<<"   ";
         bfs(1,i);
     }

    For(i,m) if(!dry[i]) sum++;
    if(sum) printf("%d\n%d",0,sum);
    else DP();
}

void init(){
    scanf("%d%d",&n,&m);
    For(i,n) For(j,m) scanf("%d",&h[i][j]);
}

queue<int>tx,ty;
int mx[5]={0,1,0,-1,0};
int my[5]={0,0,1,0,-1};
int x,y;
int nx,ny;
void bfs(int a,int b){
    memset(e,0,sizeof(e));
    tx.push(a);ty.push(b);
    e[a][b]=1;                            //cout<<b;
    while(!tx.empty()&&!ty.empty()){
        nx=tx.front();
        ny=ty.front();
        For(i,4){
            x=nx+mx[i];
            y=ny+my[i];
            if(x>=1 && x<=n && y>=1 && y<=m && e[x][y]==0 && h[x][y]<h[nx][ny]){
                tx.push(x);ty.push(y);
                e[x][y]=1;
                if(x==n){//记录区间
                    dry[y]=1;//cout<<y<<endl;
                    lft[b]=min(lft[b],y);
                    rgt[b]=max(rgt[b],y);
                }
            }

        }
        tx.pop();ty.pop();
    }
}

int g[510];
void DP(){

    memset(g,0x3f3f3f3f,sizeof(g));
    g[0]=0;
    For(i,m)
     For(j,m)
      if(lft[j]<=i && rgt[j]>=i)
       g[i]=min(g[i],g[lft[j]-1]+1);//    For(i,m) cout<<lft[i]<<"  "<<rgt[i]<<endl;
    printf("%d\n%d",1,g[m]);
}
内容概要:本文介绍了基于自适应傅里叶分解(AFD)的多通道信号分析方法,并提供了完整的Matlab代码实现,适用于复杂信号的时频分析。该方法特别针对非平稳、非线性信号具有良好的分解能力,可用于如机械故障诊断、生物医学信号处理等领域。文档还列举了多个相关研究方向和技术应用实例,包括轴承故障检测、无人机路径规划、微电网功率交换、信号去噪与预测等,展示了AFD及其他先进算法在工程实践中的广泛适用性。同时附带网盘资源链接,便于获取完整代码与资料。; 适合人群:具备一定信号处理或自动化背景的研究生、科研人员及从事机电系统故障诊断、智能算【自适应傅里叶分解AFD】多通道信号分析的自适应傅里叶分解(Matlab代码实现)法开发的工程技术人员;熟悉Matlab编程并希望将先进信号分析方法应用于实际项目的从业者;; 使用场景及目标:①在变速工况下对多通道振动信号进行高效特征提取与故障识别;②利用AFD替代传统傅里叶变换或EMD方法提升信号分解精度;③结合倒谱预白化、包络谱分析等技术实现强噪声环境下的早期故障诊断;④拓展至无人机、电力系统、通信等领域的信号建模与优化问题; 阅读建议:建议读者按目录顺序系统学习,重点关注AFD算法原理与Matlab实现细节,结合提供的案例调试代码,理解参数设置对分解效果的影响;同时可参考文中提及的其他高级算法(如鲸鱼优化、深度学习模型)进行融合创新,提升研究深度与实用性。
【源码免费下载链接】:https://renmaiwang.cn/s/puuzw MATLAB混沌工具箱,如"Chaos-Toolbox-Ver.2.0",为混沌系统研究者及工程技术人员提供了强大的工具。它特别适用于在MATLAB环境下进行混沌系统分析。该工具箱集成了多种功能模块,能够帮助用户完成Lyapunov指数计算、奇异吸引子绘制以及庞加莱截面图生成等关键任务。这些操作均与混沌动力学分析密切相关。 1. **Lyapunov指数**:正的Lyapunov指数表明系统对初始条件具有高度敏感性,这是判断一个动态系统是否为混沌系统的可靠指标。该工具箱提供了计算Lyapunov指数的功能模块,使用户能够定量评估混沌系统的稳定性特征。 2. **奇异吸引子**:通过此工具箱,用户可以方便地绘制各种典型混沌系统的奇异吸引子图形,如洛伦兹吸引子、Hénon映射等。这些可视化结果有助于深入理解复杂动力学行为。 3. **庞加莱截面图**:该工具箱内置了生成庞加莱截面图的函数模块,可将高维系统投影至二维空间,从而更直观地观察系统的长期演化规律及其潜在周期性或混沌特性。 4. **MATLAB兼容性**:Chaos-Toolbox-Ver.2.0与MATLAB7.0及7.1版本完美兼容,确保即使在较老版本的MATLAB环境中也能顺利运行相关功能模块。 5. **应用领域**:该工具箱广泛应用于气象预测、生物系统研究、经济模型分析、密码学设计以及电路仿真等多个领域。它为研究人员和工程师提供了一种高效便捷的研究方法,帮助探索各领域中的混沌现象本质。 6. **使用教程**:尽管文本中未提及具体使用说明,但通常这类工具箱都会附带用户手册或指导文档,详细解释如何利用其功能模块进行实际分析工作。有需要的用户可通过访问www.pudn.com.txt获取完整的技术指南和相关资源信息。
如果饮水机小页面是指与饮水机相关的简单网页设计或界面,可以参考以下几种实现方式: 1. **HTML+CSS基础页面设计** 创建一个简单的网页,展示饮水机的使用说明或状态信息,例如: ```html <!DOCTYPE html> <html> <head> <title>饮水机状态</title> <style> body { font-family: Arial, sans-serif; text-align: center; margin-top: 50px; } .status { font-size: 24px; color: green; } </style> </head> <body> <h1>饮水机状态</h1> <p class="status">当前状态:正常</p> </body> </html> ``` 2. **添加动态数据展示功能** 如果需要展示实时数据,例如水温或剩余水量,可以使用JavaScript结合后端API获取数据: ```html <script> fetch('https://api.example.com/water-machine/status') .then(response => response.json()) .then(data => { document.querySelector('.status').innerText = `当前水温:${data.temperature}°C`; }); </script> ``` 3. **响应式设计适配移动设备** 使用媒体查询确保页面在不同设备上都能良好显示: ```css @media (max-width: 600px) { body { margin-top: 20px; } .status { font-size: 18px; } } ``` 4. **加入交互功能(如按钮控制)** 如果饮水机支持远程控制,可以添加按钮来实现基本交互: ```html <button onclick="toggleHeater()">开关加热</button> <script> function toggleHeater() { fetch('https://api.example.com/water-machine/heater', { method: 'POST' }); } </script> ``` 5. **使用前端框架(如React或Vue)** 若需更复杂的功能,可以使用前端框架构建更可维护的界面。例如,使用React创建组件: ```javascript function WaterMachineStatus() { const [status, setStatus] = useState('加载中...'); useEffect(() => { fetch('https://api.example.com/water-machine/status') .then(res => res.json()) .then(data => setStatus(`当前状态:${data.status}`)); }, []); return ( <div> <h1>饮水机状态</h1> <p>{status}</p> </div> ); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值