August 03, 2017

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. ]

August 07, 2017

Bilmecelerle ilgili ayrı konu olmasın; burası iyi. Zaten bu kadar fazla forum bölümümüz de olmamalıydı. Elim değse birleştireceğim ama değeci de yok. :)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]