Algorithm 一次查找最大no的算法

Algorithm 一次查找最大no的算法,algorithm,language-agnostic,Algorithm,Language Agnostic,问:我们得到了一个2n个整数的数组,其中每对整数分别代表恐龙的出生年份和死亡年份。我们要考虑的有效年限范围是[-100000到2005 ]。例如,如果输入为: -80000 -79950 20 70 22 60 58 65 1950 2004 这意味着第一只恐龙的出生年份分别为-80000和-79950。同样地,第二只恐龙生活在20到70岁之间,依此类推 我们想知道在同一时期活下来的恐龙数量最多。给出上面2n个整数的数组,写一个方法来计算它 有人能提出解决办法吗 编辑尝试使用此-> 粗码 #i

问:我们得到了一个2n个整数的数组,其中每对整数分别代表恐龙的出生年份和死亡年份。我们要考虑的有效年限范围是[-100000到2005 ]。例如,如果输入为:

-80000 -79950 20 70 22 60 58 65 1950 2004
这意味着第一只恐龙的出生年份分别为-80000和-79950。同样地,第二只恐龙生活在20到70岁之间,依此类推

我们想知道在同一时期活下来的恐龙数量最多。给出上面2n个整数的数组,写一个方法来计算它

有人能提出解决办法吗

编辑尝试使用此-> 粗码

#include<stdio.h>
#include<stdlib.h>
#include <stddef.h>
static void insertion_sort(int *a, const size_t n) {
    size_t i, j;
    int value;
    for (i = 1; i < n; i++) {
        value = a[i];
        for (j = i; j > 0 && value < a[j - 1]; j--) {
            a[j] = a[j - 1];
        }
        a[j] = value;
    }
}


int  main(){
    int arr[10]={-80000,-79950,20,70,22,60,58,65,1950,2004};
    int strt[5],end[5];
    int bal[5];
     int i,j,k,l,m,length;
     l=0;
     m=0;
   for (i=0; i<10; i++){
       //printf("i = %2d arr[i] = %2d\n", i, arr[i]);
       if(i%2==0){
       strt[l]=arr[i];
       l++;
       }else{
       end[m]=arr[i];
       m++;
       }
   }
   insertion_sort(strt, sizeof strt / sizeof strt[0]);
   insertion_sort(end, sizeof end / sizeof end[0]);
   k=sizeof(end)/sizeof(int);
   for(j=0;j<5;j++){
       bal[i]=strt[i]-end[k-1];
       k--;

   }
   length=sizeof bal / sizeof bal[0];
   insertion_sort(bal, sizeof bal / sizeof bal[0]);
   printf("answer is = %2d",bal[length-1]);

}
#包括
#包括
#包括
静态空插入\u排序(int*a,常量大小\u t n){
尺寸i,j;
int值;
对于(i=1;i0&&value对于(i=0;i创建一个名为
degoralevent
的结构,并将其存储一年—事件发生的年份和事件的类型—出生或死亡。实现您自己的比较函数,将其传递给qsort,以便根据年份进行第一次排序,而不是传递给事件(考虑死亡是否发生在出生之前或其他情况,即范围是否包含在两端)迭代给定的数组并将所有事件放入向量中。之后,对向量排序并依次处理事件。同时处理给定年份的所有事件(或根据声明只计算出生或死亡)并重新计算当前活恐龙的数量(出生增加1,死亡减少1)。始终存储最大值,这将是您的答案。希望这有意义


很抱歉,我给出了完整的解决方案,我想不出一个方法来给你一个提示,但实际上没有说出来。

把每一只恐龙的出生看作是一个开放的括号,死亡看作是一个封闭的括号。然后按日期对括号进行排序-这将给你提供每一个出生和死亡事件的时间顺序。在这之后,传递给父母sis排序并计算平衡(在“(”上递增,在“)”上递减)。跟踪最大平衡,它将是答案

更新:

C++中的示例源 输入:恐龙数量n,然后是2n个出生和死亡日期。
输出:同时生活的最大恐龙数量

#包括
#包括
#包括
使用名称空间std;
int main()
{
int n;
cin>>n;
向量恐龙(2*n);//
int i;
对于(i=0;i>恐龙[2*i]。第一>>恐龙[2*i+1]。第一;
迪诺斯[2*i].second=1;//出生
恐龙[2*i+1].second=0;//死亡
}
排序(dinos.begin(),dinos.end());//首先按日期排序
int ans=0,余额=0;
对于(i=0;i
n=5
birthAndDeath = [-80000, -79950, 20, 70, 22, 60, 58, 65, 1950, 2004]
birth = [] #date of birth of dinos 
death = [] #date of death of dinos

currentAliveDinos=0
maxDinos=0
dateLastBornForMax=0
b = 0
d = 0

#we populate the both arrays for births and deaths
for i in range(0,2*n,2):
    birth.append(birthAndDeath[i])
    death.append(birthAndDeath[i+1])

#don't forget to sort arrays particuliary for death
death.sort()
birth.sort()
print birth
print death

while b!=5 and d!=5:#there are still unborn dino
    if birth[b] < death[d]: # a dino born
        currentAliveDinos = currentAliveDinos + 1
        b = b + 1 
    else: # a dino died
        currentAliveDinos = currentAliveDinos - 1
        d = d + 1       

    if maxDinos < currentAliveDinos:
        maxDinos = currentAliveDinos
        dateLastBornForMax=birth[b-1]

    print currentAliveDinos

print "max dinos = ", maxDinos, " and last dino born in ", dateLastBornForMax, " when max achieved"
n=5
出生与死亡=[-80000,-79950,20,70,22,60,58,651950,2004]
出生=[]#恐龙的出生日期
死亡=[]#恐龙死亡日期
currentAliveDinos=0
maxDinos=0
dateLastBornForMax=0
b=0
d=0
#我们填充出生和死亡的两个数组
对于范围(0,2*n,2)内的i:
出生。追加(出生与死亡[i])
death.append(birthAndDeath[i+1])
#别忘了对数组进行死亡排序
死亡排序
出生排序
打印出生
印刷死亡
而b!=5和d!=5:#还有未出生的恐龙
如果出生[死亡]:#一只恐龙出生
currentAliveDinos=currentAliveDinos+1
b=b+1
否则:#一只恐龙死了
currentAliveDinos=currentAliveDinos-1
d=d+1
如果maxDinos
#包括
#包括
#包括
使用名称空间std;
int main()
{
无符号整数n;
cin>>n;
向量恐龙(2*n);//
无符号整数i;
对于(i=0;i>恐龙[2*i]。第一>>恐龙[2*i+1]。第一;
迪诺斯[2*i].second=1;//出生
恐龙[2*i+1].second=0;//死亡
}
排序(dinos.begin(),dinos.end());//首先按日期排序
int ans=0,余额=0;
对于(i=0;ijava的示例源代码

输入:恐龙数量n,出生日期n,死亡日期n

产出:有史以来最大数量的恐龙同时存活

import java.util.Arrays;

public class Dinosaur {

   public static void main(String args[]) {
        int birthAndDeath[] = { -80000, -79950, 20, 70, 22, 60, 58, 65, 1950, 2004};
        System.out.print("Maximum number of dinosaurs that were ever alive at one time: " + new Dinosaur().findMaxdinosaur(birthAndDeath));
    }

   /**
    * Find the Maximum number of dinosaurs that were ever alive at one time.
    * @param years
    * @return maximum number of dinosaurs that were ever alive at one time.
    */
   public int findMaxdinosaur (int[] years) {
        /** For birth array */
        int birthArray[] = new int [years.length/2];

        /** For death array */
        int deathArray[] = new int [years.length/2]; 

        int birthCounter = 0, deathCounter = 0;
        int currentAliveDinos = 0;

        /** Maximum number of dinosaurs that were ever alive at one time. */
        int maxDinos = 0; 

        int position = 0;

        /** To get the birth and death values in different array */
        for(int index = 0; index < years.length; index = index + 2) {
            birthArray[position] = years[index];
            deathArray[position] = years[index + 1];
            position++;
        }       

        /** Sort the birth and death array in ascending order. */
        Arrays.sort(birthArray);
        Arrays.sort(deathArray);

        /** Calculating max number of dinosaurs that were ever alive at one time **/
        while( birthCounter != years.length/2 && deathCounter != years.length/2) {
            if(birthArray[birthCounter] < deathArray[deathCounter]) {
                currentAliveDinos++;
                birthCounter++;
            } else {
                currentAliveDinos--;
                deathCounter++;
            }
            if(maxDinos < currentAliveDinos) {
                maxDinos = currentAliveDinos;
            }
        }
        return maxDinos;
   }
}
导入java.util.array;
公共级恐龙{
公共静态void main(字符串参数[]){
int出生与死亡[]={-80000,-79950,20,70,22,60,58,65,1950,2004};
System.out.print(“一段时间内活着的恐龙的最大数量:“+新恐龙().FindMax恐龙(出生与死亡));
}
/**
*找出在同一时间内活着的恐龙的最大数量。
*@param年
*@return一次活下来的恐龙的最大数量。
*/
公共int FindMax恐龙(int[]年){
/**用于出生数组*/
int birthArray[]=新int[years.length/2];
/**死亡阵法*/
int deathArray[]=新int[年长/2];
int出生计数器=0,死亡计数器=0;
int currentAliveDinos=0;
/**最大数量o
Largest number of dinosaurs that were ever alive at one time?
import java.util.Arrays;

public class Dinosaur {

   public static void main(String args[]) {
        int birthAndDeath[] = { -80000, -79950, 20, 70, 22, 60, 58, 65, 1950, 2004};
        System.out.print("Maximum number of dinosaurs that were ever alive at one time: " + new Dinosaur().findMaxdinosaur(birthAndDeath));
    }

   /**
    * Find the Maximum number of dinosaurs that were ever alive at one time.
    * @param years
    * @return maximum number of dinosaurs that were ever alive at one time.
    */
   public int findMaxdinosaur (int[] years) {
        /** For birth array */
        int birthArray[] = new int [years.length/2];

        /** For death array */
        int deathArray[] = new int [years.length/2]; 

        int birthCounter = 0, deathCounter = 0;
        int currentAliveDinos = 0;

        /** Maximum number of dinosaurs that were ever alive at one time. */
        int maxDinos = 0; 

        int position = 0;

        /** To get the birth and death values in different array */
        for(int index = 0; index < years.length; index = index + 2) {
            birthArray[position] = years[index];
            deathArray[position] = years[index + 1];
            position++;
        }       

        /** Sort the birth and death array in ascending order. */
        Arrays.sort(birthArray);
        Arrays.sort(deathArray);

        /** Calculating max number of dinosaurs that were ever alive at one time **/
        while( birthCounter != years.length/2 && deathCounter != years.length/2) {
            if(birthArray[birthCounter] < deathArray[deathCounter]) {
                currentAliveDinos++;
                birthCounter++;
            } else {
                currentAliveDinos--;
                deathCounter++;
            }
            if(maxDinos < currentAliveDinos) {
                maxDinos = currentAliveDinos;
            }
        }
        return maxDinos;
   }
}