Created
December 9, 2016 12:41
-
-
Save qgp9/41e3c072bb505a0044d80e50e12ee139 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdio.h> | |
int main(){ | |
const int NK = 3; | |
const int NN = 5; | |
int sizes[NK] = { 5, 4, 4 }; | |
int arr[NK][NN] = { | |
{4, 10, 15, 24, 26}, | |
{0, 9, 12, 20}, | |
{5, 18, 22, 30}, | |
}; | |
int indice[NK]; | |
for( int k=0;k<NK;k++ ){ | |
indice[k] = 0; | |
} | |
int min_k = 0; | |
int max_k = 0; | |
int range[2] = { -1e9, 1e9 }; | |
while( indice[min_k] < sizes[min_k] ){ | |
min_k = max_k = 0; | |
for( int k=0;k<NK;k++ ){ | |
if( arr[min_k][indice[min_k]] > arr[k][indice[k]] ) min_k = k; | |
if( arr[max_k][indice[max_k]] < arr[k][indice[k]] ) max_k = k; | |
} | |
if( arr[max_k][indice[max_k]]-arr[min_k][indice[min_k]] < range[1]-range[0] ){ | |
range[1] = arr[max_k][indice[max_k]]; | |
range[0] = arr[min_k][indice[min_k]]; | |
} | |
indice[min_k]++; | |
} | |
printf("%d\t%d\n",range[1],range[0]); | |
return 0; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
#include <vector> | |
#include <cstdio> | |
#include <algorithm> | |
#include <utility> | |
typedef std::vector<int> ints; | |
typedef std::vector<ints> intss; | |
typedef unsigned int uint; | |
intss gen_array1(){ | |
intss arr = { | |
{4, 10, 15, 24, 26}, | |
{0, 9, 12, 20}, | |
{5, 18, 22, 30}, | |
}; | |
return arr; | |
} | |
int main(){ | |
auto arr = gen_array1(); | |
//== iterators of each array | |
std::vector<std::pair<ints*,ints::iterator>> iters( arr.size() ); | |
ints range(2); | |
range[0] = -1e9; // tmp min | |
range[1] = 1e9; // tmp max | |
//== point of iterator | |
auto min_iter= &iters[0]; | |
auto max_iter= &iters[0]; | |
//== Fill inter with first elements of arrays | |
for( uint k = 0 ; k < arr.size(); k++ ) | |
iters[k] = { &arr[k], arr[k].begin() }; | |
//== Loop until end up to any array. | |
while(min_iter->second != min_iter->first->end()){ | |
//== init min/max. can be improved but let's keep simple | |
min_iter = max_iter = &iters[0]; | |
for( auto k = iters.begin() ; k != iters.end(); k++ ){ | |
//== Can be improved by checking of last max and new iters[min_k] | |
if( *(k->second) < *(min_iter->second) ) min_iter = &*k; | |
//== Can be improved by checking of last max and new iters[min_k] | |
if( *(k->second) > *(max_iter->second) ) max_iter = &*k; | |
} | |
//printf("min,max => %10d (%2d), %10d (%2d)\n", min,min_k, max, max_k); | |
if( *(max_iter->second) - *(min_iter->second) < range[1]-range[0] ) | |
range = { *(min_iter->second), *(max_iter->second) }; | |
min_iter->second++; | |
} | |
std::cout<<range[0]<<", "<<range[1]<<std::endl; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment