2020阿里330实习生笔试题

一、养鸡场

给定鸡场数量–n,养鸡天数–m,每次增加数量k
n个养鸡场原始鸡的数量在第二行进行输入
每一天开始时,每个养鸡场都增加k只鸡;每一天结束时,将数量最多的鸡场数量减半(向下取整)

向上取整, 运算称为 Ceiling,用数学符号 ⌈⌉ (上有起止,开口向下)表示,。 向下取整, 运算称为 Floor,用数学符号 ⌊⌋
(下有起止,开口向上)表示。

输出 : m天过去后,当前养鸡场总共还有多少鸡;

输入:
n m k------------------------------------->3 3 100
n个数:a[0]~a[n];a[i]表示第i个养鸡场的大小--->100 200 400
输出:
res--------------------------------------->925
我的解题思路:

暴力法,不想讲了;复杂度O(kn);----->复杂度过大报错
第二个想的是将其一开始一开始排序,利用插入排序的方法选取最大值;
(⊙_⊙)?:考虑重复最大值时通过率为0;
正确解题思路:
由于每次都会加上k值,所以考虑将其全部提出;每次都选取最大值减去应该减去值(a[maxIndex]+k*i )/2;

Arrays.Sort(a);
for(i:0~m-1){
    1、选取最大值减去a[0] -= (a[0]+k);//需要考虑偶数咋办
    2、利用插入排序算法,while()将数组进行排序;//sort和插入排序此处哪个复杂度最高?
}
输出:Sum(a) + n*m*k;

--------------别人用的是PriorityQueue,需要增长知识点┭┮﹏┭┮-----------------

public static void main(String[] args) {
    Scanner s = new Scanner(System.in);
    int n = s.nextInt();
    int m = s.nextInt();
    int k = s.nextInt();
    long[] res = new long[n];
    for(int i=0;i<n;i++){
        res[i] = s.nextLong();
    }
    Arrays.sort(res);//比较器只能用于int???
    for(int i=1;i<=m;i++){
    	res[n-1] -= Math.ceil((res[n-1]+k*i)>>1);//向下取整,减去向上取整的数
    	int j = n-1;
    	while (j>0 && res[j]<res[j-1]) {//比他小就换位置,始终保持排序
			long temp = res[j];
			res[j] = res[j-1];
			res[j-1] = temp;
			j--;
		}
    }
    long out = k*m*n;
    for(long num: res){
        out += num;
    }
    System.out.println(out);
}

二、求期望值

给定连续子串数组长度–n
第二行输入n个数组的值;

解释: 给出一个包含n个整数的序列,从中任意选出一个子序列,求子序列最大值的期望?例如,【1、2、3】,连续子串有【1】【2】【3】【1、2】【2、3】【1、2、3】,故最大值的期望为 33/6 + 22/6 + 1*1/6 = 2.333333;
补充个数学期望的知识点:

输入:
n--------------------------------->3
n个数:a[0]~a[n];连续数组----------->1 2 3
输出:
res--------------------------------------->925
思路:
输入数组为a//此处不写输入代码了
initialize-->int[] array = new int[n];
double sum = 0;//总共有多少个子序列
for(i:0~n-1){
    sum += n-i;
    for(int j=i;j<n;j++){
        array[j] ++;
    }
}
//计算期望值;
double res = 0.00;
for(int i=0;i<n;i++){
    res += ((double)array[i]/sum)*a[i];
}
System.out.println(res);
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值