Diyelimki elimde iki dizi var :
2 5 3 1 11 4 4
7 8 2 4 1 8
Şöyle toplamı eşit alt kümeler oluşturmaya çalışıyorum.
[2,5] = [7] = 7
[3 1 11] = [8 2 4 1] = 15
[4 4] = [8] = 8
Yani eşit oluncaya kadar ilerlemek istiyorum.
Ben bunu şöyle index kullanarak çözdüm :
import std.stdio;
import std.algorithm;
import std.range;
import std.string;
import std.array;
import std.conv;
import std.math;
void Isle(T)( T küçükDizi, T büyükDizi, ref int kacKere )
{
int hedef = büyükDizi.front();
büyükDizi.popFront();
int toplam = 0;
while( true )
{
toplam += küçükDizi.front();
if (toplam <= hedef )
küçükDizi.popFront();
if ( toplam >= hedef )
{
if ( küçükDizi.empty() || büyükDizi.empty() )
{
kacKere++;
return;
}
else
{
if ( toplam > hedef)
küçükDizi.front() = toplam - hedef;
else
kacKere++;
if( küçükDizi.front > büyükDizi.front )
Isle(büyükDizi, küçükDizi, kacKere);
else
Isle(küçükDizi, büyükDizi, kacKere);
}
return;
}
}
}
int main(string[] argv)
{
auto girişDizisi = stdin.readln.to!dstring.chomp.split.map!( a => to!int(a) );
auto ilkDizi = stdin.readln.to!dstring.chomp.split.map!( a => to!int(a) ).array;
auto ikinciDizi = stdin.readln.to!dstring.chomp.split.map!( a => to!int(a) ).array;
int sonuç = 0;
if( ilkDizi.front > ikinciDizi.front )
Isle(ikinciDizi, ilkDizi, sonuç);
else
Isle(ilkDizi, ikinciDizi, sonuç);
writeln(sonuç);
return 0;
}
Sorunun aslı şu linkte http://codeforces.com/contest/950/problem/B
Walter abimizin özlü sözü "programramımızdaki döngüler buglardır" deyişinden dolayı Işle metodundan "while(true)" 'u çıkarmak istiyorum .
Öyle bir method lazımki bir şekilde toplamı alarak ilerliyecek o nokta geldiğinde bana o aralığın sonrasını verecek.
Acaba böyle bir std methodu varmıdır ?
Erdemdem
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]