zoukankan      html  css  js  c++  java
  • 1395. Count Number of Teams

    问题:

    给定一组带有评分rating的士兵序列。

    求从中挑出3个士兵 i, j, k (i<j<k)为一个小组,使得第 i, j, k 名士兵的 rating递增or递减。

    这样的小组有多少个。

    Example 1:
    Input: rating = [2,5,3,4,1]
    Output: 3
    Explanation: We can form three teams given the conditions. (2,3,4), (5,4,1), (5,3,1). 
    
    Example 2:
    Input: rating = [2,1,3]
    Output: 0
    Explanation: We can't form any team given the conditions.
    
    Example 3:
    Input: rating = [1,2,3,4]
    Output: 4
     
    Constraints:
    n == rating.length
    1 <= n <= 200
    1 <= rating[i] <= 10^5
    

      

    解法:

    由于是3元组,

    那么我们以中间元素 j 为参照系,

    分别 在 j 的左边(i<j) 找 i,在 j 的右边(j<k) 找 k

    1. 递增的情况:

    找到 i 满足 rating[i]<rating[j]:有x1种情况
    找到 k 满足 rating[j]<rating[k]:有y1种情况

    则满足题意的三元组有 x1*y1 种情况。

    2. 递减的情况:

    找到 i 满足 rating[i]>rating[j]:有x2种情况
    找到 k 满足 rating[j>rating[k]:有y2种情况

    则满足题意的三元组有 x2*y2 种情况。

    对此时的 j 来说,一共有 x1*y1+x2*y2 种情况。

    代码实现上,

    我们遍历 j 从第二个元素 j=1 开始,到倒数第二个元素 j=size-2。(由于j为三元组中间元素,前面必有 i,后面必有 k)

    对于每一个 j ,

    我们遍历整个序列,找 i,k

    使用 less保存 rating i < rating j 的情况

    使用 greater保存  rating i > rating j 的情况

    那么同时找 i 和 k 的话,一个 小于 j, 一个 大于 j

    less[i<j] -> less[0]:i>j: i代表k && rating i < rating j 的情况
                    less[1]: i<j: i代表i && rating i < rating j 的情况
    greater[i<j] -> greater[0]:i>j: i代表k && rating i > rating j 的情况
                         greater[1]: i<j: i代表i && rating i > rating j 的情况

    因此,对于当前的 j 来说,有

    less[0]*greater[1]  : i<j<k && rating[i] > rating[j] > rating[k] :递减

    +

    less[1]*greater[0] : i<j<k && rating[i] < rating[j] < rating[k] :递增

    种情况。

    代码参考:

     1 class Solution {
     2 public:
     3     int numTeams(vector<int>& rating) {
     4         int res=0;
     5         for(int j=1; j<rating.size()-1; j++){
     6             int less[2]={0}, greater[2]={0};
     7             for(int i=0; i<rating.size(); i++){
     8                 if(rating[i]<rating[j]){
     9                     less[i<j]++;
    10                 }else if(rating[i]>rating[j]){
    11                     greater[i<j]++;
    12                 }
    13             }
    14             res += (less[1]*greater[0] + less[0]*greater[1]);
    15         }
    16         return res;
    17     }
    18 };
  • 相关阅读:
    洛谷P4587 [FJOI2016]神秘数(主席树)
    洛谷P4609 [FJOI2016]建筑师(第一类斯特林数+组合数)
    Bzoj4016/洛谷P2993 [FJOI2014] 最短路径树问题(最短路径问题+长链剖分/点分治)
    Bzoj1486/洛谷P3199 最小圈(0/1分数规划+spfa)/(动态规划+结论)
    Bzoj4753/洛谷P4432 [JSOI2016]最佳团体(0/1分数规划+树形DP)
    Bzoj3197/洛谷3296 [SDOI2013]刺客信条assassin(树的重心+树Hash+树形DP+KM)
    关于二分图的完美匹配问题
    Bzoj3837 [Pa2013]Filary(随机化)
    Bzoj3566/洛谷P4284 [SHOI2014]概率充电器(概率dp)
    杜教筛学习笔记
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/13335718.html
Copyright © 2011-2022 走看看