牛客编程巅峰赛S1第12场

A-牛牛算数

题目描述

给你一个含有n个元素的数组arr[i],请你告诉牛牛这个数组的中位数大还是平均数大,如果中位数更大输出1,如果平均数更大输出-1,如果中位数和平均数相等输出0

示例1

输入

[1,3,4]

输出

1

说明:

中位数3,平均数约等于2.67,所以输出1

示例2

输入

[7,4,8,11]

输出

0

说明

中位数7.5,平均数7.5,所以输出0

示例3

输入

[6,6,6,6,5,8]

输出

-1

说明

中位数6,平均数约等于6.17,所以输出-1

备注:

对于30%30%的数据: 1<=n<=1e3,1<=arr[i]<=1e9,1≤n≤1e3,1≤arr[i]≤1e9
对于100%100%的数据: 1<=n<= 1e6,1<= arr[i]<=1e9,1≤n≤1e6,1≤arr[i]≤1e9

用double就行

class Solution {
public:
    /**
     * 
     * @param arr int整型vector 
     * @return int整型
     */
    int Answerofjudge(vector<int>& arr) {
        // write code here
        sort(arr.begin(),arr.end());
        double sum=0,mid;
        int len=arr.size();
        if(len%2==0)
            mid=(double)(arr[len/2]+arr[len/2-1])/2;
        else
            mid=arr[len/2];
        for(auto i:arr)
            sum+=i;
        if(sum/len<mid)
            return 1;
        else if(sum/len>mid)
            return -1;
        return 0;
    }
};

B-牛牛质数

题目描述

牛牛有一个质数p,和两个区间[a,b],[c,d],分别在两个区间中取一个数x,y。求有多少对(x,y)使得x∗y是p的倍数。给定你两个区间,求从区间中取出数相乘是p的倍数的个数。

示例1

输入

3,7,4,6,3

输出

9

说明:

(3,4),(3,5),(3,6),(4,6),(5,6),(6,6),(7,6),(6,4),(6,5)一共有9个

备注:

1≤a≤b≤10^9
1≤c≤d≤10^9
1≤p≤10^9
数据保证p为质数

这题如果直接枚举范围的每一个整数容易超时,直接枚举p的整数倍就行,然后判断是否在范围内再进行计算。

class Solution {
public:
    /**
     * 返回两个区间内各取一个值相乘是p的倍数的个数
     * @param a int整型 第一个区间的左边界
     * @param b int整型 第一个区间的右边界
     * @param c int整型 第二个区间的左边界
     * @param d int整型 第二个区间的右边界
     * @param p int整型 质数
     * @return long长整型
     */
    long long numbers(int a, int b, int c, int d, int p) {
        // write code here
        long long int sum=0,sum1=0,sum2=0;
        int tmp;
        for(int i=1;i*p<=b;i++){
            if(i*p>=a&&i*p<=b){
                tmp=i*p;
                sum1++;
                break;
            }
        }
        sum1+=((b-tmp)/p);
        sum=(d-c+1)*sum1;
        for(int i=1;i*p<=d;i++){
            if(i*p>=c&&i*p<=d){
                tmp=i*p;
                sum2+=(b-a+1)-sum1;
                break;
            }
        }
        return sum+sum2+((d-tmp)/p)*(b-a+1-sum1);
    }
};

C-锻炼身体

题目描述

疫情期间,牛牛整天摊在床上沉溺于手机,身体日渐虚胖,因此牛妹拿走家中的 wifi 路由器,迫使牛牛下床来拿到路由器。在这过程中,牛牛想要在尽可能短的时间内拿到路由器,而牛妹却希望牛牛多走一会儿。现假设牛妹家中有 nn 个房间,任意两个房间有且仅有一条路径,起初路由器在编号为 xx 的房间内,牛牛在编号为 1 的房间内,牛牛与牛妹速度相同,当俩人同时开始移动,牛牛要经过几个房间才能拿到路由器。
只要牛牛和路由器处在同一房间,便看作牛牛已拿到路由器。
输入
第一个参数为 nn ,(1≤n≤100,000)

第二个参数为 xx ,(1≤x≤n)

第三个参数为大小为 n-1的点对 (u_i, v_i)

输出

牛牛最多需要经过的房间数(包括 1 号房间在内)。

示例1

输入

5,2,[(1,2),(2,3),(3,4),(2,5)]

输出

4

说明

当牛妹将路由器放到 4 号房间时,牛牛需要经过 1 -> 2 -> 3 -> 4 共四个房间。

这题没看懂,听老师解说是一棵树,用dfs找出离牛妹近离牛牛远的结点即可。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值