Median---ZOJ

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4322

#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<vector>
#include<cmath>
#include<stdlib.h>
#include<iomanip>
#include<list>
#include<deque>
#include<map>
#include <stdio.h>
#include <queue>

#define maxn 10000+5
#define ull unsigned long long
#define ll long long
#define reP(i,n) for(i=1;i<=n;i++)
#define rep(i,n) for(i=0;i<n;i++)
#define cle(a) memset(a,0,sizeof(a))
#define mod 90001
#define PI 3.141592657

const ull inf = 1LL << 61;
const double eps=1e-5;

using namespace std;

bool cmp(int a,int b){
return a>b;
}
double a[505];
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int t,n;
cin>>t;
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%lf",&a[i]);
sort(a+1,a+1+n);
if(n%2!=0)printf("%.3lf\n",a[n/2+1]);
else
{
double t=(a[n/2]+a[n/2+1])/2;
printf("%.3lf\n",t);
}
}
return 0;
}


主要练习C语言输入输出
1 printf输出float和double都可以用%f,double还可以用%lf。
2 scanf输入float用%f,double输入用%lf,不能混用。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你好!感谢您对ChitGPT的信任。对于您的问题,我可以为您提供以下回答: ``` public static int linearSelect(int[] S, int k) { if (S.length == 1) { return S[0]; } // Divide S into groups of 5 elements each int[] group = new int[5]; int[] medians = new int[(int) Math.ceil((double) S.length / 5)]; for (int i = 0; i < S.length; i += 5) { int endIndex = i + 5; if (endIndex > S.length) { endIndex = S.length; } for (int j = i; j < endIndex; j++) { group[j - i] = S[j]; } // Sort the group of 5 elements Arrays.sort(group); // Find the median of the group medians[i / 5] = group[2]; } // Recursively find the median of the medians int medianOfMedians = linearSelect(medians, (medians.length + 1) / 2); // Partition S around the median-of-medians int[] left = new int[S.length]; int[] right = new int[S.length]; int leftIndex = 0, rightIndex = 0; for (int i = 0; i < S.length; i++) { if (S[i] < medianOfMedians) { left[leftIndex++] = S[i]; } else if (S[i] > medianOfMedians) { right[rightIndex++] = S[i]; } } // Determine which partition to recurse on if (k <= leftIndex) { return linearSelect(Arrays.copyOf(left, leftIndex), k); } else if (k == leftIndex + 1) { return medianOfMedians; } else { return linearSelect(Arrays.copyOf(right, rightIndex), k - leftIndex - 1); } } ``` 该算法将数组元素分成多个较小的组,并找到每个组的中位数。接下来,它递归地在这些中位数中找到中位数,直到找到一个特定元素。然后,它根据小于、等于和大于中位数的元素将数组分成三个部分,并递归地执行算法,直到它找到了第 k 个最小元素。 该算法的时间复杂度为 O(n),它实现了线性时间选择。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值