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我的水平就到这里了哈哈哈哈(暂时)

原文地址:https://www.cnblogs.com/Dancing-Fairy/p/12776157.html