• 2022河南萌新联赛第(七)场:南阳理工学院 H-防风台


    H-防风台_2022河南萌新联赛第(七)场:南阳理工学院 (nowcoder.com)

    题意:

    思路:

    首先,让我们求最大值最小,很容易就想到二分

    而二分的结果应当是它给出的难度值当中的,因此不能按以前那种二分的写法,应该在难度值数组中二分,当然二分之前肯定要先排序~

    然后我们去写check函数

    也就是说,我们已知一个最大难度值,我们去看这个最大难度值是否满足条件

    题目要求说矩阵每行每列都至少有一个防风台,那么我们把小于等于这个二分出来的最大难度值的防风台都建上(这其实是一个贪心,二分的check函数经常伴随着贪心),然后去判断每行每列是否真的至少一个防风台即可 

    Code:

    1. #include
    2. using namespace std;
    3. const int mxn=1e3+10;
    4. #define int long long
    5. int n,m,len=0,ans;
    6. int a[mxn][mxn],b[1000010],lie[mxn],hang[mxn];
    7. bool check(int x){
    8. memset(hang,0,sizeof(hang));
    9. memset(lie,0,sizeof(lie));
    10. for(int i=1;i<=n;i++){
    11. for(int j=1;j<=m;j++){
    12. if(a[i][j]<=x){
    13. lie[j]=1;
    14. hang[i]=1;
    15. }
    16. }
    17. }
    18. for(int i=1;i<=n;i++){
    19. if(!hang[i]) return false;
    20. }
    21. for(int j=1;j<=m;j++){
    22. if(!lie[j]) return false;
    23. }
    24. return true;
    25. }
    26. signed main(){
    27. scanf("%lld%lld",&n,&m);
    28. for(int i=1;i<=n;i++){
    29. for(int j=1;j<=m;j++) scanf("%lld",&a[i][j]),b[++len]=a[i][j];
    30. }
    31. sort(b+1,b+1+len);
    32. int l=1,r=len;
    33. while(l<=r){
    34. int mid=l+r>>1;
    35. if(check(b[mid])){
    36. ans=mid;
    37. r=mid-1;
    38. }else l=mid+1;
    39. }
    40. printf("%lld\n",b[ans]);
    41. }

    总结:

    1.读清题意,一开始以为是每行每列都至多出现一个防风台,然后以为是二分+dfs(类似于八皇后),后来才发现是至少一个防风台

    2.什么时候使用二分做法:

    求最大值最小Or求最小值最大

    求最值且发现具有单调性

    枚举未遂,且单调,即二分

    3.害怕做法过于暴力就去算一算复杂度

  • 相关阅读:
    PostgreSQL 排查慢 SQL
    udev匹配两张网卡
    什么是Docker CLI
    WPF里ItemsControl的分组实现
    Java 垃圾回收机制
    git快速使用教程
    Windows使用模拟器启动AOSP源码编译的镜像
    windows powershell 将U盘启动盘还原回普通U盘
    Kubernetes: kube-apiserver 之认证
    软考 系统架构设计师系列知识点之设计模式(7)
  • 原文地址:https://blog.csdn.net/weixin_62528401/article/details/126466077