• Cockroaches


    Cockroaches 

    题意:有n只虫,每只虫的位置都用一个横竖坐标表示,现在有一种杀虫剂,这种杀虫剂放到某一点,它能将所在它所在的行和列的所有虫杀死,现在让求出只放一个杀虫剂,最多能杀多少只虫和在满足杀最多只虫的情况下,有多少种放置方法能杀这么多只虫。

    题解具体见代码

    AC_Code:

     1 /*
     2 记录每个点的横纵坐标所在行列的点的数目
     3 找到最大的maxx,maxy,max_x = maxx+maxy
     4 其实消灭蟑螂的最大数目只能是max_x,或者max_x-1
     5 cnt1 :  max_x 的集合数目
     6 cnt2 :  max_x -1  集合数目
     7 */
     8 #include <bits/stdc++.h>
     9 using namespace std;
    10 typedef long long ll;
    11 #define endl '
    '
    12 const int mod=1e9+7;
    13 const int maxn=1e8+10;
    14 
    15 ll n;
    16 map<ll,ll>cntx,cnty;
    17 ll maxx,maxy;
    18 ll cntx1,cntx2,cnty1,cnty2;
    19 ll cnt1,cnt2;
    20 ll max_x;
    21 
    22 int main()
    23 {
    24     int t,cas=0; scanf("%d",&t);
    25     while( t-- ){
    26         scanf("%lld",&n);
    27         cntx.clear(); cnty.clear();
    28         vector<pair<ll,ll>>ve(n);
    29 
    30         maxx=0,maxy=0;
    31         for(auto &it: ve){//前面ve(n)一定要是n,不然输入不完
    32             scanf("%d%d",&it.first,&it.second);
    33             maxx = max(maxx, ++cntx[it.first]);
    34             maxy = max(maxy, ++cnty[it.second]);
    35         }
    36 
    37         if( cntx.size()==1 || cnty.size()==1 ){//全在一列或者全在一行
    38             printf("Case %d: %lld 1
    ",++cas,n);
    39             continue;
    40         }
    41         if( maxx==1 && maxy==1 ){//每行每列都只有一只(例如对角线的情况),我们最多能杀两只,有n*(n-1)/2种情况。
    42             printf("Case %d: 2 %lld
    ",++cas,n*(n-1)/2);
    43             continue;
    44         }
    45         cntx1=0,cntx2=0;
    46         cnty1=0,cnty2=0;
    47         for(auto &it : cntx){
    48             if( it.second==maxx ) cntx1++;
    49             else if( it.second==maxx-1 ) cntx2++;//就算没有maxx-1也没关系,因为maxx最多会多算一个,maxx是一定存在的,如果没有maxx-1的话,maxx会变成maxx-1,所以次大只能是maxx-1
    50         }
    51         for( auto &it : cnty){
    52             if( it.second==maxy ) cnty1++;
    53             else if( it.second==maxy-1 ) cnty2++;//就算没有maxy-1也没关系,因为maxy最多会多算一个,maxy是一定存在的,如果没有maxy-1的话,maxy会变成maxy-1,所以次大只能是maxy-1
    54         }
    55         max_x=maxx+maxy;
    56         cnt1=cntx1*cnty1;//max_x的个数
    57         cnt2=cntx1*cnty2+cnty1*cntx2;//max_x-1的个数
    58 
    59         for( auto &it : ve){
    60             ll num=cntx[it.first]+cnty[it.second];
    61             if( num==max_x){//杀虫剂放在有虫的地方,行和列交叉的地方有虫,多算了一次,这个地方其实是max_x-1
    62                 cnt1--;//max_x的个数--
    63                 cnt2++;//max_x-1的个数++
    64             }
    65             else if( num==max_x-1 ) cnt2--;//原理同上,这个地方放杀虫剂应该消灭了max_x-2只
    66         }
    67         if( cnt1 ){
    68             printf("Case %d: %lld %lld
    ",++cas,max_x,cnt1);
    69         }else{
    70             printf("Case %d: %lld %lld
    ",++cas,max_x-1,cnt2);
    71         }
    72     }
    73     return 0;
    74 }

    参考博客:here

  • 相关阅读:
    Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。
    react.js
    IE8 frameset SESSION丢失
    回调函数参数问题,闭包解决方案示例
    自定义 httpHandler 配置
    查看SQLServer数据库每个表占用的空间大小
    数据库备份到局域网其他电脑
    SpringSecurity权限管理系统实战—一、项目简介和开发环境准备
    java开发环境配置,看这一篇就足够了!
    java23种设计模式——八、组合模式
  • 原文地址:https://www.cnblogs.com/wsy107316/p/13469650.html
Copyright © 2020-2023  润新知