zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    用于Delphi的DevExpress VCL组件——富文本编辑功能升级
    5个技巧,教你优化React App性能
    DevExpress WPF模板库助力快速完成界面美化
    Web开发小技巧放送
    WinForm应用界面开发入门指南
    浅析C#中单点登录的原理和使用
    Wireshark抓包,带你快速入门
    你必须知道的EF知识和经验
    你知道SqlDataAdapter中的Fill是怎么实现的吗
    一文说通C#中的异步编程
  • 原文地址:https://www.cnblogs.com/wsy107316/p/13469650.html
Copyright © 2011-2022 走看看