猪八戒吃西瓜(wmelon)-排序-查找

问题 A: 猪八戒吃西瓜(wmelon)

时间限制: 1 Sec  内存限制: 64 MB
提交: 30  解决: 14
[提交][状态][讨论版]

题目描述

有一天,贪吃的猪八戒来到了一个大果园,果园里有n(n≤100000)个大西瓜,每个西瓜 的质量不大于长整型(longint),并且每个西瓜的质量都不同。猪八戒非常无聊,先把所有的西瓜按从小到大排列,然后再选m(m≤l00000)个质量是Ki的西瓜,请你帮他把想吃的西瓜找出来。

输入

第1行输入n,然后以下n行输入n个整数;
接着输入m,然后以下m行,每行一个整数Ki。

输出

输出m行,每行一个整数,表示重新排列后,Ki在这N个数中的位置。

样例输入

3
132
123
145
1
123

样例输出

1解题思路:距离上一次做题已经一星期了,主要是因为题做不下去了,基础太弱,稍微复杂点的算法题就做不出来了,由于心比较浮躁,算法也看不懂。。。要时刻提醒自己:保持一颗平静的心!!  这个题里面的输出说:表示重新排列后,ki在里面的位置,让我误以为每取一次后面的数字都得减1!!!然后提交两遍不对。  然后zxp提醒后,改完提交AC了。  由于数据量太多,不能每取一个就查找一次,那样即使用二分查找也得nlogn,也是比较大的。  最好的方法是只查找一次:将查找的数字从小到大排序,然后从已排好序的西瓜里开始找,找到一个后接着从上一个的位置开始找就可以,这样时间复杂度是n;   例:西瓜:    2 3 5 7 8 9   设置一个i;   要查找的排好序: 3  8         设一个j;  j=1的时候,i从1到3所在下标;j=2时,i从3的下标到8的下标,查找完后i从1到n;  然后再按输入顺序排序,输出排序后的下标即可。

代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstdlib>

using namespace std;

struct node{
    long int k;
    long int ksortw;
    long int kcinw;
};
node xigua[100002];

int comp(const void*a,const void*b)
{
   return *(int*)a-*(int*)b;
}

int cmp(node a,node b){
    return a.k<b.k;
}

int cmp2(node a,node b){
    return a.kcinw<b.kcinw;
}

int main()
{
    long int n;
    long int a[100002];
    long int m;

    long int cou=0;
    scanf("%ld",&n);
    for(long int i=1;i<=n;i++){
        scanf("%ld",&a[i]);
    }
    qsort(a+1,n,sizeof(long int),comp);
    scanf("%ld",&m);
    for(long int i=1;i<=m;i++){
        scanf("%ld",&xigua[i].k);
        xigua[i].kcinw=i;
    }
    sort(xigua+1,xigua+m+1,cmp);
    long int i=1;
    long int j=1;
    while(1){
        if(j==m+1){
            break;
        }
        if(a[i]==xigua[j].k){
           //printf("%ld\n",i);
           xigua[j].ksortw=i;
           j++;
        }else{
           i++;
        }
    }
    sort(xigua+1,xigua+m+1,cmp2);
    for(int i=1;i<=m;i++){
        printf("%d\n",xigua[i].ksortw);
    }

    return 0;
}
 
时间: 2024-10-13 15:16:11

猪八戒吃西瓜(wmelon)-排序-查找的相关文章

猪八戒吃西瓜(wmelon)

猪八戒吃西瓜(wmelon) 题目描述 有一天,贪吃的猪八戒来到了一个大果园,果园里有n(n≤100000)个大西瓜,每个西瓜 的质量不大于长整型(longint),并且每个西瓜的质量都不同.猪八戒非常无聊,先把所有的西瓜按从小到大排列,然后再选m(m≤l00000)个质量是Ki的西瓜,请你帮他把想吃的西瓜找出来. 输入 第1行输入n,然后以下n行输入n个整数: 接着输入m,然后以下m行,每行一个整数Ki. 输出 输出m行,每行一个整数,表示重新排列后,Ki在这N个数中的位置. 样例输入 3 1

【转载】Java集合类的排序,查找,替换操作

转自:http://blog.csdn.net/sunhuaqiang1/article/details/52142873 前言 在Java方向校招过程中,经常会遇到将输入转换为数组的情况,而我们通常使用ArrayList来表示动态数组.获取到ArrayList对象后,我们可以根据Collection中的方法进行排序,查找,替换操作.而不用在东奔西走的利用什么各种排序算法.正则来实现了.在进行数组排序时,有时反而会因为参数问题而大费周折.例如,自己在利用快排进行数组排序时,当将参数(int []

Java数据结构 遍历 排序 查找 算法实现

1. 遍历算法(遍历二叉树6种方法) 1.1. 概述 遍历算法针对二叉树而言的,主要有先序.中序.后序三种遍历顺序,三种顺序又分别有递归和常规算法,二叉树遍历的主要思想是:遍历左子树,遍历右子树,访问根节点,由这三者的遍历顺序来确定是先序.中序还是后序.下面只要求掌握递归遍历算法,常规遍历算法见附录一. 1.2. 先序遍历算法 遍历顺序:访问根节点,遍历左子树,遍历右子树.代码如下: void preOrder(BinaryTreeNode bt) { if (bt == null)// 如果当

C/C++ 排序&amp;&amp;查找算法(面试)

一.排序 1.冒泡排序 1 void BubbleSort(int array[],int n) 2 { 3 int i=0; 4 int j=0; 5 int temp=0; 6 int flag = 0; 7 for(i=0;i<n - 1 ;i++) /*外循环控制排序的总趟数*/ 8 { 9 flag = 0; /*本趟排序开始前,交换标志应为假*/ 10 for(j=n-1;j > i;j--) /*内循环控制一趟排序的进行*/ 11 { 12 if(array[j] < ar

成绩排序查找

西南科技大学 ACM解题报告 姓名:张艺童 学号:5120142109 组号:3 班级:软件1402 1 题目来源:OJ  0616 2 题目描述: Description: 用选择法对N个学生的成绩按从大到小的顺序排序,N个学生的成绩整数用scanf 输入,输入的成绩在[0,100]之间.排序完成后,输入一个成绩,要求用逐个比较查找的方式找出该成绩是该组中第几个元素的值(即第几名).如果该成绩不在数组中,则输出“no this score!”. 要求: 1.把排序算法写成函数形式,在主函数中输

数组高级部分--排序,查找

1.数组排序之冒泡排序: 两两比较,大的往后放放,第一次比较完毕之后,最大值就出现在了最大索引出,继续依次比较,得到一个排好序的数组! 2.数组排序之:选择排序:           用0索引依次和后面的索引进行比较,第一次比较完毕之后,最小值出现在了最小索处!               同理,其他索引也是依次进行比较! 3.数组查找 基本查找:数组元素查表法(查询数组中的元素第一次在数组中出现的索引):从头查到尾                     数组二分查找(折半查找) 思路:   

面试常见算法-排序查找算法

算法是程序员必被的一个技能,在面试中常常出现,下面总结了面试中出现的常见算法,这些算法程序员应该牢记在心中,要非常熟练. 插入排序算法 原理:将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所有无序区元素都移动到有序区完成排序. 要点:设立哨兵,作为临时存储和判断数组边界之用. public class InsertSort { private static void insertSort(int[] a) { int j; int tmp; for

Java排序查找算法——二分法与递归的应用实例

问题描述: 对数组元素进行查找与排序,利用二分法与递归实现. 完整实例1: public class SortDemo {    public static void main(String[] args)    {       int[] arr={10,2,300,41,15,6};       for(int a:arr)       {          System.out.print("["+a+"]");           }      // new

排序查找

归并排序:(nlog(n)  小->大) 1.将数组分成两部分 2.将两部分分别排序 3.将排完序的两部分合为一部分 void merge_sort(int x,int y){ if(y-x <= 1) return; int m = x + (y-x)/2; int p = x,q = m,i = x; merge_sort(x,m); merge_sort(m,y); while(p < m || q < y){ if(q >= y || (p < m&&a