Guzel bir soru gordum ve paylasmak istedim,
Soruyu aciklamadan once soyle bir onerim olacak acaba bilmeceler gibi bir konu acsakda orayami yazsam guzel D sorularini. Tabi tamamem Turkceye cevirerek. Uzuldugum nokta Rusya, Cin ve bir suru Arap universiteleri ogrencileri boyle seylere kanalize ediyorlar fakat bizde pek boyle bir kultur yok. Dolayisiyla soyle istatistiklerde hic gozukemiyoruz https://www.go-hero.net/jam/17/regions. Belki ilgilenen gencler olur.
Bu soru cok hosuma gitti urettigim cozum zaman testinden gecemedi, aklima bir kac degisiklik geliyor isten eve donunce deniyecegim.
Simdi A-Z'ye kadar bir kapilar var. Ve belirli sayida gardiyanimiz var. Bir suru misafir gelicek ve her misafirin hangi kapidan gecip gelicegi belli. Gardiyanlar actiklari kapiyi kapamadan baska kapiyi acamiyorlar. Acaba yeterli sayida gardiyanimiz varmi.
Ornegin
5 1 -> 5 misafir var ve bir gardiyan var demek
AABBB --> Ilk iki misafi A kapisindan gelicek daha baska A dan gelicek olmadigindan dolayi A'i acan gardiyan kapayabilir.
Sonraki 3 misafir B kapisindan gecicekler. A kapi kapandigindan ayni gardiyan kapiyi acabilir.
Bu durumda yeterli gardiyanimiz var.
Baska bir ornek
5 1 -> Yine 5 misafir gelicek ve 1 gardiyan var
ABABB -> A kapisi kapanmadan once B kapisinin acilmasi lazim fakat bu durumda bir tane gardiyan yeterli degil cunku
Gardiyanlar bir kapi kapanmadan oteki acamiyor. Bu durumda iki tane gardiyan gerekli idi.
Bu durumda cevabimiz yetersiz olmasi lazim .
Benim zaman testini gecemeyen kodum. Performans haric dogru calisiyor sanki.
import std.stdio;
import std.string;
import std.algorithm;
import std.conv;
import std.array;
import std.range;
import std.math;
KapiDegerleri[int] kapiTablosu;
int[] kapilar;
struct KapiDegerleri
{
int m_kapiBaslangicIndeksi = -1;
int m_kapiBitisIndeksi;
int[] m_digerKapilar;
this( int index )
{
m_kapiBaslangicIndeksi = index ;
m_kapiBitisIndeksi = m_kapiBaslangicIndeksi;
}
void Baslat( int index )
{
m_kapiBitisIndeksi = index;
}
void DigerKapilariHesapla()
{
void EklemeFonksiyonu( int kapiNumarasi )
{
if ( kapiNumarasi != kapilar[m_kapiBaslangicIndeksi] )
{
if ( !m_digerKapilar.canFind(kapiNumarasi) )
m_digerKapilar ~= kapiNumarasi;
}
}
kapilar[m_kapiBaslangicIndeksi..m_kapiBitisIndeksi].each!( a => EklemeFonksiyonu(a) );
}
int Hesapla()
{
int donusDegeri = 0;
bool geciciDeger = false;
if ( m_kapiBaslangicIndeksi == m_kapiBitisIndeksi)
return donusDegeri;
DigerKapilariHesapla();
void UzunlukHesabi( int kapiNumarasi )
{
if (kapiTablosu[kapiNumarasi].m_kapiBitisIndeksi > m_kapiBitisIndeksi)
donusDegeri++;
else
geciciDeger = true;
}
m_digerKapilar.each!( a => UzunlukHesabi(a) );
if ( geciciDeger)
donusDegeri++;
return donusDegeri;
}
}
int main(string[] argv)
{
auto dizge = stdin.readln.chomp.split.map!( to!int );
kapilar = stdin.readln.chomp.map!( a => cast(int)( a - 'A') ).array;
for (int i = 0; i < kapilar.length; i++)
{
KapiDegerleri* p;
p = (kapilar[i] in kapiTablosu);
if (p !is null)
{
p.Baslat(i);
}
else
{
kapiTablosu[kapilar[i]] = KapiDegerleri( i );
}
}
auto maksimumDegerDizgesi = kapiTablosu.values.map!( a => a.Hesapla() );
int gerekliGardiyanSayisi = maksimumDegerDizgesi.reduce!(max) + 1;
if ( dizge[1] >= gerekliGardiyanSayisi )
writeln("NO");
else
writeln("YES");
return 0;
}
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]
Permalink
Reply