• 2020.4.25 leetcode 编程战队赛


    第一题,很简单,其实就是求不同元素的个数

    某互联网公司一年一度的春招开始了,一共有 n 名面试者入选。每名面试者都会提交一份简历,公司会根据提供的简历资料产生一个预估的能力值,数值越大代表越有可能通过面试。

    小 A 和小 B 负责审核面试者,他们均有所有面试者的简历,并且将各自根据面试者能力值从大到小的顺序浏览。由于简历事先被打乱过,能力值相同的简历的出现顺序是从它们的全排列中等可能地取一个。现在给定 n 名面试者的能力值 scores,设 X 代表小 A 和小 B 的浏览顺序中出现在同一位置的简历数,求 X 的期望。

    提示:离散的非负随机变量的期望计算公式为 1。在本题中,由于 X 的取值为 0 到 n 之间,期望计算公式可以是 2

    示例 1:

    输入:scores = [1,2,3]

    输出:3

    解释:由于面试者能力值互不相同,小 A 和小 B 的浏览顺序一定是相同的。X的期望是 3 。

    示例 2:

    输入:scores = [1,1]

    输出:1

    解释:设两位面试者的编号为 0, 1。由于他们的能力值都是 1,小 A 和小 B 的浏览顺序都为从全排列 [[0,1],[1,0]] 中等可能地取一个。如果小 A 和小 B 的浏览顺序都是 [0,1] 或者 [1,0] ,那么出现在同一位置的简历数为 2 ,否则是 0 。所以 X 的期望是 (2+0+2+0) * 1/4 = 1

    示例 3:

    输入:scores = [1,1,2]

    输出:2

    限制:

    • 1 <= scores.length <= 10^5
    • 0 <= scores[i] <= 10^6
    int expectNumber(vector<int>& scores) {
            sort(scores.begin(),scores.end());
            int cnt=1;
            for(int i=1;i<scores.size();i++){
                if(scores[i]!=scores[i-1])cnt++;
            }
            return cnt;
        }

    第二题,我最开始用dp做,其实是可以做出来的,只不过三层循环超时妥妥的,,看了大佬的解法后才知道原来是二分最大天数,妙啊。。

    为了提高自己的代码能力,小张制定了 LeetCode 刷题计划,他选中了 LeetCode 题库中的 n 道题,编号从 0n-1,并计划在 m 天内按照题目编号顺序刷完所有的题目(注意,小张不能用多天完成同一题)。

    在小张刷题计划中,小张需要用 time[i] 的时间完成编号 i 的题目。此外,小张还可以使用场外求助功能,通过询问他的好朋友小杨题目的解法,可以省去该题的做题时间。为了防止“小张刷题计划”变成“小杨刷题计划”,小张每天最多使用一次求助。

    我们定义 m 天中做题时间最多的一天耗时为 T(小杨完成的题目不计入做题总时间)。请你帮小张求出最小的 T是多少。

    示例 1:

    输入:time = [1,2,3,3], m = 2

    输出:3

    解释:第一天小张完成前三题,其中第三题找小杨帮忙;第二天完成第四题,并且找小杨帮忙。这样做题时间最多的一天花费了 3 的时间,并且这个值是最小的。

    示例 2:

    输入:time = [999,999,999], m = 4

    输出:0

    解释:在前三天中,小张每天求助小杨一次,这样他可以在三天内完成所有的题目并不花任何时间。

    限制:

    • 1 <= time.length <= 10^5
    • 1 <= time[i] <= 10000
    • 1 <= m <= 1000
     bool satisfy(vector<int>& time, int m, int maxT){
            int sum=0;
            int maxtime=0;
            int day=0;
            for(int i=0;i<time.size();i++){
                maxtime=max(time[i],maxtime);
                sum+=time[i];
                if(sum-maxtime>maxT){
                    if(++day==m)return false;
                    sum=time[i];
                    maxtime=time[i];
                }
            }
            return true;
        }
        int minTime(vector<int>& time, int m) {
            if(time.size()<=m)return 0;
            int sum=0;
            for(int i=0;i<time.size();i++){
                sum+=time[i];
            }
            int l=0,r=INT_MAX;
            while(l<r){
                int mid=(l+r)/2;
                if(!satisfy(time,m,mid))l=mid+1;
                else
                    r=mid;
            }
            return l;
        }

    第三题,,dbq我的水平就到这里了哈哈哈哈(暂时)

  • 相关阅读:
    Linux虚拟机的安装(使用Centos6.3)
    【转载】接口测试用例的设计原则
    Oracle PLSQL游标、游标变量的使用
    利用shell脚本将Oracle服务器中数据定时增量刷新到ftp服务器中
    源码安装rlwrap 0.43(为了方便使用linux下的sqlplus)
    Oracle自定义脱敏函数
    Oracle分析函数FIRST_VALUE、LAST_VALUE
    MYSQL性能测试工具SYSBENCH
    OEL7.6源码安装MYSQL5.7
    OEL7.6安装Oracle Database 19C(VERSION 19.3.0.0)
  • 原文地址:https://www.cnblogs.com/Dancing-Fairy/p/12776157.html
Copyright © 2020-2023  润新知