当前位置: 首页 > news >正文

NKOJ全TJ计划——NP11793

题目内容

33DAI 进入了一个\(n\)\(n\)列的二维数组。数组中每个位置都有一只羊,第\(i\)行第\(j\)列的羊的重量是\(a_{i,j}\)

33DAI 一开始在\(a_{1,1}\)的位置,每次可以往右一步或者往下一步。即可以从\(a_{x,y}\)走到\(a_{x+1,y}\)或者\(a_{x,y+1}\)。但是不能走出这个数组,即不能走到下标小于\(1\)或大于\(n\)的位置。他走到\(a_{n,n}\)就会停下。

他每次到达一个位置就会牵走那里的羊,显然最终他一共走了\(2n-1\)步,牵走了\(2n-1\)头羊。33DAI 会在这些羊中拿出最重的\(k\)只羊送给 Kitten 作为她 10 月 9 日的生日礼物。他希望这些羊都足够重,他想知道所有牵羊方案中,哪种方案的最重的\(k\)只羊中最轻的那只羊最重。

说人话就是,从\(a_{1,1}\)走到\(a_{n,n}\),每次只能向右或者向下,求路径上的数中的第\(k\)名最大是多少。

题目分析

这道题是求某个数的最大值,可以很自然地联想到二分答案。
我们可以看到\(a_{i,j}\)的范围是\([1,10^9]\)对值域二分后还可以有一个\(Θ(n^2)\)的操作,而我们的二分\(ch(x)\)的意思是验证从\(a_{1,1}\)\(a_{n,n}\)存在着一条路径,使得路径上有不少于\(k\)个点使得这些点的权值大于或等于\(x\),于是可以考虑动态规划。
定义动态规划数组\(f_{i,j}\)为从\(a_{1,1}\backsim a_{i,j}\)的路径上至多有几个\(\ge x\)的点。很显然,递推方程式为\(f_{i,j}=max(f_{i-1,j},f_{i,j-1})+(a_{i,j}\ge x)\)
然后返回\((f_{n,m}\ge m)\)
顺便提一嘴,\(f_{i,j}\)的初始值全是零。

代码

#include<bits/stdc++.h>
using namespace std;
int n,m,i,j,ans,a[1003][1003],f[1003][1003],maxa,l,r,mid;
int ch(int x){for(int i=1;i<=n;i++){for(int j=1;j<=n;j++) f[i][j]=0;}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){f[i][j]=max(f[i-1][j],f[i][j-1])+(a[i][j]>=x);
//			cout<<f[i][j]<<"\t";}
//		cout<<"\n";}for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){if(f[i][j]>=m) return 1;}}return 0;
}
int main()
{cin>>n>>m;for(i=1;i<=n;i++){for(j=1;j<=n;j++) scanf("%d",&a[i][j]),maxa=max(maxa,a[i][j]);}l=0,r=maxa;
//	cout<<"\n"<<ch(4)<<"\n";while(l<r){mid=(l+r)/2;
//		cout<<l<<" "<<mid<<" "<<r<<"\n";if(ch(mid)) l=mid;else r=mid-1;if(l==r-1){if(ch(r)) l=r;break;}}cout<<l;
}
http://www.zskr.cn/news/3547.html

相关文章:

  • JBoltAI函数调用技术:自然语言即可查询数据库,重构企业数据交互方式
  • 题解:CF645B Mischievous Mess Makers
  • NKOJ全TJ计划——NP11792
  • 完整教程:Photo Lab PRO 图片编辑器 功能解锁版
  • Ubuntu 18.04 虚拟机 VScode无法正常输入中文解决办法
  • qoj1847 Elephants
  • 基于ArcGIS的通用界址点导入导出工具设计与实现
  • python 函数作用域
  • 文献阅读 | AutoCodeBench
  • Idea win 快捷键大全
  • VSCode+neovim工作环境快速构建
  • 25.9.12随笔联考总结
  • macos
  • 算法复杂度
  • Typescript中Type 类型的实现原理
  • 戒己谨言
  • 更美观的网页布局
  • 深入解析:每日一算:电话号码的字母组合
  • Marvell,跌落神坛!
  • 老同志们的93阅兵镜头
  • 鸿蒙应用开发环境搭建全攻略
  • 一个类继承一个接口的实现类、两个类实现同一个接口、两个类同时继承一个实现了某一接口的抽象类。三者的区别是什么呢
  • 计算机常识
  • 网络流,最大流,EK算法
  • 1.认识c语言
  • 当你发现是打表!!!
  • css背景
  • 2025.9.11 刷题日记
  • 水库运行综合管理平台
  • Nginx配置文件介绍