一、养鸡场
给定鸡场数量–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);