#include
#include
#include
#include
#include
#include
using namespace std;
int const island[] = { 54, 50, 54, 54, 52, 55, 51, 59, 50, 56, 52, 50 };
/////////////// Pos # 0 1 2 3 4 5 6 7 8 9 10 11
int const size = sizeof(island) / sizeof(int);
int accu = 0;
//adapted from STL
template
ForwardIterator max_element_last(ForwardIterator scanner, ForwardIterator const end) {
ForwardIterator ret = scanner;
if (scanner == end)
return ret;//empty range, with zero element!
while (++scanner != end)
if (*ret <= *scanner) //"=" means find LAST
ret = scanner;
return ret;
}
//print height and address of a column
void print1(int const* const pos, char const * const label) {
//int const height = *pos;
printf("%s=%d/%d ", label, *pos, pos - island);
}
void printAll(int const* const L, int const* const l, int const* const h,
int const* const H) {
if (l < h) {
print1(L, "wallL");
print1(l, "ptr");
printf(" ");
print1(h, "ptr");
print1(H, "wallH");
} else {
print1(H, "wallH");
print1(h, "ptr");
printf(" ");
print1(l, "ptr");
print1(L, "wallL");
}
printf("%d=Accu\n", accu);
}
//Rule: move the lo-side pointer only
void onePassAlgo(){
int*loptr; //moving pointer, moving-inward.
int*wallLo, *wallHi; //latest walls
int*h;
//1st we ASSUME the first left side wall will be lower than the first right side wall
wallLo = loptr = const_cast
wallHi = h = const_cast
//2nd, we validate that assumption
if (*wallLo > *wallHi) {
std::swap(wallLo, wallHi);
std::swap(loptr, h);
}
// now lo is confirmed lower than the hi side
printAll(wallLo,loptr,h,wallHi);
printf("All pointers initialized (incl. 2 walls\n");
while (loptr != h) {
if (*loptr > *wallHi) {
wallLo = wallHi;
wallHi = loptr;
std::swap(loptr, h);
//printf("new wallHi:");
} else if (*loptr >= *wallLo) {//see the >=
wallLo = loptr;
//printf("wallLo updated:");
} else {
assert (*loptr < *wallLo);
accu += (*wallLo - *loptr);
printf("adding %d liter of water at Pos_%d (%d=A\n", *wallLo - *loptr,
loptr - island, accu);
}
printAll(wallLo,loptr,h,wallHi);
// only by moving the loptr (not h) can we confidently accumulate water
if (loptr < h)
++loptr; //lo side is on the left, move loptr right
else
--loptr; //lo side is on the right, move loptr left
}
}
void twoPassAlgo() {//less convoluted
int const* const peak = max_element_last(island, island + size);
printf("highest peak (last if multiple) is %d, at Pos %d\n", *peak, peak
- island);
//(island, island + size, ostream_iterator
//forward scan towards peak
int* pos = const_cast
int* wall = pos;
for (++pos; pos < peak; ++pos) {
if (*wall > *pos) {
accu += *wall - *pos; // accumulate water
printf("adding %d liter of water at Pos#%d (T=%d)\n", *wall - *pos,
pos - island, accu);
continue;
}
//ALL new walls must match or exceed previous wall.
printf("found new wall of %d^ at Pos#%d\n", *pos, pos - island);
wall = pos;
}
cout << "^^^ end of fwd scan ; beginning backward scan vvv\n";
//backward scan
pos = const_cast
wall = pos;
for (--pos; pos > peak; --pos) {
if (*wall > *pos) {
accu += *wall - *pos; // accumulate water
printf("adding %d liter of water at Pos#%d (T=%d)\n", *wall - *pos,
pos - island, accu);
continue;
}
//Note all new walls must match or exceed previous wall.
printf("found new wall of %d^ at Pos#%d\n", *pos, pos - island);
wall = pos;
}
}
int main(int argc, char *argv[]) {
twoPassAlgo();
accu = 0;
cout<<"-----------------------------\n";
onePassAlgo();
}
/*
Requirement -- a one-dimentional island is completely covered with columns of bricks.
If between Column
A(height 9) and Column B(10) all columns are lower, then we get a basin to
collect rainfall. Watermark height (absolute) will be 9. We can easily calculate the
amount of water. If I give you all the column heights, give me total rainfall collected.
Code showcasing
- stl algo over raw array
- array/pointer manipulation
- array initialization
- array size detection
- std::max_element modified
- std::swap
*/
Sunday, April 22, 2012
island rainfall problem - more documentation
Labels: gr8IV_Q
my favorite topics (labels)
_fuxi
(302)
_misLabel
(13)
_orig?
(3)
_rm
(2)
_vague
(2)
clarified
(58)
cpp
(39)
cpp_const
(22)
cpp_real
(76)
cpp/java/c#
(101)
cppBig4
(54)
cppSmartPtr
(35)
cppSTL
(33)
cppSTL_itr
(27)
cppSTL_real
(26)
cppTemplate
(28)
creditMkt
(14)
db
(65)
db_sybase
(43)
deepUnder
(31)
dotnet
(20)
ECN
(27)
econ/bank`
(36)
fin/sys_misc
(43)
finGreek
(34)
finReal
(45)
finRisk
(30)
finTechDesign
(46)
finTechMisc
(32)
finVol
(66)
FixedIncom
(28)
fMath
(7)
fMathOption
(33)
fMathStoch
(67)
forex
(39)
gr8IV_Q
(46)
GTD_skill
(15)
GUI_event
(30)
inMemDB
(42)
intuit_math
(41)
intuitFinance
(57)
javaMisc
(68)
javaServerSide
(13)
lambda/delegate
(22)
marketData
(28)
math
(10)
mathStat
(55)
memIssue
(8)
memMgmt
(66)
metaProgram`
(6)
OO_Design
(84)
original_content
(749)
polymorphic/vptr
(40)
productive
(21)
ptr/ref
(48)
py
(28)
reflect
(8)
script`/unix
(82)
socket/stream
(39)
subquery/join
(30)
subvert
(13)
swing/wpf
(9)
sysProgram`
(16)
thread
(164)
thread_CAS
(15)
thread_cpp
(28)
Thread*
(22)
timeSaver
(80)
transactional
(23)
tune
(24)
tuneDB
(40)
tuneLatency
(30)
z_ajax
(9)
z_algoDataStruct
(41)
z_arch
(26)
z_arch_job
(27)
z_automateTest
(17)
z_autoTrad`
(19)
z_bestPractice
(39)
z_bold
(83)
z_bondMath
(35)
z_book
(18)
z_boost
(19)
z_byRef^Val
(32)
z_c#GUI
(43)
z_c#misc
(80)
z_cast/convert
(28)
z_container
(67)
z_cStr/arr
(39)
z_Favorite*
(8)
z_FIX
(15)
z_forex
(48)
z_fwd_Deal
(18)
z_gz=job
(33)
z_gzBig20
(13)
z_gzMgr
(13)
z_gzPain
(20)
z_gzThreat
(19)
z_hib
(19)
z_IDE
(52)
z_ikm
(5)
z_IR_misc
(36)
z_IRS
(26)
z_javaWeb
(28)
z_jdbc
(10)
z_jobFinTech
(46)
z_jobHunt
(20)
z_jobRealXp
(10)
z_jobStrength
(15)
z_jobUS^asia
(27)
z_letter
(42)
z_linq
(10)
z_memberHid`
(11)
z_MOM
(54)
z_nestedClass
(5)
z_oq
(24)
z_PCP
(12)
z_pearl
(1)
z_php
(20)
z_prodSupport
(7)
z_py
(31)
z_quant
(14)
z_regex
(8)
z_rv
(38)
z_skillist
(48)
z_slic`Problem
(6)
z_SOA
(14)
z_spring
(25)
z_src_code
(8)
z_swingMisc
(50)
z_swingTable
(26)
z_unpublish
(2)
z_VBA/Excel
(8)
z_windoz
(17)
z_wpfCommand
(9)

About Me
- familyman
- New York (Time Square), NY, United States
- http://www.linkedin.com/in/tanbin

No comments:
Post a Comment