poj 2623 快排

一、题目大意

就是求中间的数。

二、AC code

递归快排ac版:

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <vector>
#include <cmath>
#include <algorithm>
#include <set>
#include <cassert>
#include <time.h>
#include <queue>
#include <map>
#include <stack>
#include <bitset>
#include <string>
#include <sstream>
#include <list>
#define INF 0x3f3f3f3f

using namespace std;

template <class Type>
Type stringToNum(const string& str)
{
    istringstream iss(str);
    Type num;
    iss >> num;
    return num;
}

//======================================================

#define MAXN 250002

int a[MAXN];

void quickSort(int *arr, int left, int right){
    int i = left, j = right;
    int mid = arr[(i+j)/2];
    while(i <= j){
        while(arr[i] < mid) i ++;
        while(arr[j] > mid) j --;
        if(i <= j){
            int tmp;
            tmp = arr[i]; arr[i] = arr[j]; arr[j] = tmp;
            i ++; j --;
        }
    }
    if(i < right) quickSort(arr,i, right);
    if(left < j) quickSort(arr,left, j);
}

int main()
{
    //freopen("input.txt","r",stdin);

    int N;
    cin>>N;

    for (int i = 1; i <= N; ++i) {
        scanf("%d",&a[i]);
    }

    quickSort(a,1,N);

    if(N%2) //odd
        printf("%d.0\n", a[(N+1)/2]);
    else {
        double sum = (double)a[N/2] + (double)a[N/2+1];
        printf("%.1lf\n", sum / 2);
    }

    return 0;
}

可以水过,但是不知道为什么用g++也会WA,用c++ OK
同时因为数的范围过大,用计数排序不靠谱。

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <vector>
#include <cmath>
#include <algorithm>
#include <set>
#include <cassert>
#include <time.h>
#include <queue>
#include <map>
#include <stack>
#include <bitset>
#include <string>
#include <sstream>
#define INF 0x3f3f3f3f

using namespace std;

template <class Type>
Type stringToNum(const string& str)
{
    istringstream iss(str);
    Type num;
    iss >> num;
    return num;
}

//======================================================

#define MAXN 250002

long long a[MAXN];

int main()
{
    //freopen("input.txt","r",stdin);

    int N;
    cin>>N;

    for (int i = 1; i <= N; ++i) {
        scanf("%lld",&a[i]);
    }

    sort(a+1,a+N+1);

    //odd
    if(N%2)
        printf("%lld.0\n", a[(N+1)/2]);
    else {
        //printf("%.1lf\n", ((double)a[N/2]+(double)a[(N/2)+1])/2); //ok

        //ok
//      double sum = (double)a[N/2]+(double)a[(N/2)+1];
//      printf("%.1lf\n",sum / 2);

        printf("%.1lf\n", (double)(a[N/2]+a[(N/2)+1])/2);
    }

    return 0;
}

stl二分会超时:

#include <iostream>
#include <stdio.h>
#include <cstring>
#include <vector>
#include <cmath>
#include <algorithm>
#include <set>
#include <cassert>
#include <time.h>
#include <queue>
#include <map>
#include <stack>
#include <bitset>
#include <string>
#include <sstream>
#include <list>
#define INF 0x3f3f3f3f

using namespace std;

template <class Type>
Type stringToNum(const string& str)
{
    istringstream iss(str);
    Type num;
    iss >> num;
    return num;
}

//======================================================

#define MAXN 250002

vector<int > v;

//有序数组递减排列
int  binarySearch(vector<int > array,int len,int value){
    int mid=0;
    int low=0;
    int high=len-1;
    while(low<=high){
        mid=(low+high)/2;
        if(array[mid]>value){       //在右半区
            low=mid+1;
            continue;
        }
        else if(array[mid]<value){  //在左半区
            high=mid-1;
            continue;
        }else
            return mid;             //找到
    }
    return low;  //insert pos
}

int main()
{
    //freopen("input.txt","r",stdin);

    int N;
    cin>>N;

    for (int i = 1; i <= N; ++i) {
        long long tmp;
        scanf("%lld",&tmp);

        int pos = binarySearch(v,i-1,tmp);
        v.insert(v.begin() + pos, tmp);
    }

    if(N%2) //odd
        printf("%lld.0\n", v[(N+1)/2-1]);
    else
        printf("%.1lf\n", (double)(v[N/2-1]+v[N/2])/2);

    return 0;
}
时间: 2024-08-04 03:51:46

poj 2623 快排的相关文章

c语言题目求帮助--快排

问题描述 c语言题目求帮助--快排 文档下载"> 解决方案 你的cmp函数定义不对,修改为 int cmp(const void * a, const void * b) { return abs(*(int *)b) - abs(*(int *)a); }

关于快排,你知道多少?

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 有朋友公司打算做快排,问我关于快排的事,其实说实话,好久没有接触快排了.可能很多人还不知道什么是快排,简单点说,快排就是快速排名,让指定关键词指定内容快速在搜索引擎获得排名,快排只是这个行业专门造的一个词. 具体点说,你的公司需要做一些长尾关键词的排名,可以交给做快排的人,他们会短时间帮你把你这个关键词排名做起来,在用户搜索这个关键词的时候就

HDOJ(HDU) 1862 EXCEL排序(类对象的快排)

Problem Description Excel可以对一组纪录按任意指定列排序.现请你编写程序实现类似功能. Input 测试输入包含若干测试用例.每个测试用例的第1行包含两个整数 N (<=100000) 和 C,其中 N 是纪录的条数,C 是指定排序的列号.以下有 N 行,每行包含一条学生纪录.每条学生纪录由学号(6位数字,同组测试中没有重复的学号).姓名(不超过8位且不包含空格的字符串).成绩(闭区间[0, 100]内的整数)组成,每个项目间用1个空格隔开.当读到 N=0 时,全部输入结

【算法】5 传说中的快排是怎样的

什么是快速排序 快速排序简介 快速排序(英文名:Quicksort,有时候也叫做划分交换排序)是一个高效的排序算法,由Tony Hoare在1959年发明(1961年公布).当情况良好时,它可以比主要竞争对手的归并排序和堆排序快上大约两三倍.这是一个分治算法,而且它就在原地排序. 所谓原地排序,就是指在原来的数据区域内进行重排,就像插入排序一般.而归并排序就不一样,它需要额外的空间来进行归并排序操作.为了在线性时间与空间内归并,它不能在线性时间内实现就地排序,原地排序对它来说并不足够.而快速排序

快排的思考

9.9.1 快速排序介绍        终于我们的高手要登场了,如果将来你工作后,你的老板要让你写个排序算法,而你会的算法中竟然没有快速排序,我想你还是不要声张,偷偷去把快速排序算法找来敲进电脑,这样至少你不至于被大伙儿取笑.         事实上,不论是C++ STL.Java SDK或者.NET FrameWork SDK等开发工具包中的源代码里都能找到它的某种实现版本.          快速排序算法最早由图灵奖获得者Tony Hoare设计出来的,他在形式化方法理论,以及ALGOL60

快排QuickSort

1.算法思想: /**      * 一趟快速排序的算法是: 1).设置两个变量I.J,排序开始的时候I:=1,J:=N:      *      * 2)以第一个数组元素作为关键数据,赋值给X,即X:=A[1]:      *      * 3).从J开始向前搜索,即由后开始向前搜索(J:=J-1),找到第一个小于X的值,两者交换:      *      * 4).从I开始向后搜索,即由前开始向后搜索(I:=I+1),找到第一个大于X的值,两者交换:      *      * 5).重复第

POJ题目分类

初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      (4)递推.      (5)构造法.(poj3295)      (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法:      (1)图的深度优先遍历和广度优先遍历.      (2)最短路径算法(dijkstra,bellman-ford

poj分类

初期: 一.基本算法:      (1)枚举. (poj1753,poj2965)      (2)贪心(poj1328,poj2109,poj2586)      (3)递归和分治法.      (4)递推.      (5)构造法.(poj3295)      (6)模拟法.(poj1068,poj2632,poj1573,poj2993,poj2996) 二.图算法:      (1)图的深度优先遍历和广度优先遍历.      (2)最短路径算法(dijkstra,bellman-ford

poj 2159 Ancient Cipher

这题主要应该就是理解题意的问题,我的确是把题目理解错了,WA了三次,每次都以为一定是正确的,后来看了别人的解释才知道是题目理解错了(竟然还看到了别人的结题报告也有错的...),另外就是学会了用STL的sort快排,很方便,在<algorithm>头文件里面,这说明了一定要自己会写排序,但是不一定每次都是自己写函数,有N多好的函数别人已经写好了,你只用知道什么时候该用就可以了...但是自己也要会写(万一比赛不允许用库函数) 开始错误的想法: #include <iostream> #