PDA

Tam Sürümünü Görmek İçin : sinema salonu.


golgepapaz
13/03/2008, 16:08
forum'un tepesinde Odtu bilgisayar toplulugunun yarisma ilanini gorunce bir heves edip

katiliyim dedim, belki egelenceli birseyler olur diye ama her zamanki aceleciligim yuzunden
katilma sartlarini okumadan sorulara daldigim icin, katilabilmek icin universite ogrencisi olma sartini bir arkadas hatirlatana kadar, sorulardan birini cozmus bulundum.:iih: eh bosa gitmesin diye burda paylasayim dedim. on eleme sorularini adresi budur.

http://www.cclub.metu.edu.tr/yarisma/2008/on_eleme_sorulari

Sorulardan sinema salonu adli sorunun , c++ STL ile cozumu...


#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <iterator>

using namespace std;

template<class T>
inline void print_elements(const T& cont)
{
typename T::const_iterator i;

for( i=cont.begin(); i!= cont.end();++i)
{
cout<<*i<<" ";
}
cout<<endl;
}
int main()
{
ifstream inputfile("in.txt");
ofstream outputfile("out.txt");
int number_of_spec ;
inputfile >> number_of_spec;
vector<int> ragelevel,ordered_heights,heigths;

for(int i=number_of_spec;i!=0 ;i--)
heigths.push_back(i);
print_elements(heigths);

std::copy(istream_iterator<int>(inputfile),istream_iterator<int>(),back_inserter<vector<int> >(ragelevel));
print_elements(ragelevel);

vector<int>::reverse_iterator rageleveliter = ragelevel.rbegin();
for(;rageleveliter != ragelevel.rend(); ++rageleveliter)
{
ordered_heights.push_back(heigths[*rageleveliter]);
remove(heigths.begin(),heigths.end(),heigths[*rageleveliter]);
}

reverse(ordered_heights.begin(),ordered_heights.en d());
print_elements(ordered_heights);

std::copy(ordered_heights.begin(),ordered_heights. end(),ostream_iterator<int> (outputfile," "));
}


Size sorumda ayni problemi cozen C programi yazmaniz. sonrada iki programi karsilastirip , C,C++ tartismasi yapariz :)


-aga-
13/03/2008, 16:54
dosya işlemleri beni aşar.
Verileri okuttuğumuzu varsayarsak. Çözümleme kısmı şu şekilde olabilir
// N=Kişi sayısı;
// sinirler[N]= 0'dan N-1'e kadar kişilerin sinirleri.Okuttuk varsayıyorum.
// boylar[N]=0'dan N-1'e kadar kişilerin boyları. Biz bulacağız.
// yedek[N]=Gerimizde kalan uzun boylular.

int yedek[n]={0};
for (int a=n-1;a>=0;a--)
{
int el=sinirler[a],el2=n;
while(el>0)
{
el2--;
if (yedek[el2]==0)
el--;
}
boylar[a]=el2;
yedek[el2-1]=1;
}

nibble
13/03/2008, 19:06
yarışmaya gireceklere yol gösteriyosunuz. yarışmanın bi anlamı kalmıyo :)

-aga-
14/03/2008, 08:22
Zaten algoritmada ufak bir hata var.:)

-aga-
14/03/2008, 08:50
@nibble bunlar ön eleme sorusu, hiç bir anlamı yok zaten.
Bu kolay sorularla adamlara ödül verecek değiller ya.
Algoritmanın doğrusu da şöyle.

int yedek[n]={0};
for (int a=n-1;a>=0;a--)
{
int el=sinirler[a]+1,
int el2=n;
while(el>0)
{
el2--;
if (yedek[el2]==0)
el--;
}
boylar[a]=el2+1;
yedek[el2]=1;
}

nibble
14/03/2008, 13:27
aga takıl kafana göre :D

acehreli
19/03/2008, 21:29
golgepapaz'in cozumu super! :)

Ben hic o cozume bakmadan kendim yapmaya calistim. Zaman buldukca ilerleyerek C++'tan cok C'ye benzeyen, ozyinelemeli ve dalli budakli bir cozum buldum. :) Soyle bir sey: En sag koltuktan baslayarak ilk buldugun 0 sinirli yere en uzunu oturt. Sonra sinirlerin ne olmasi gerektigini hesaplayarak ikinci en uzunu oturtmaya calis. vs.

golgepapaz'inki cok temiz. :)

Ali

cshell
21/03/2008, 02:59
bence bunu yayınlamamanız gerekirdi yoksa bi esprisi kalmaz.Ödev konusundaki hassasiyeti bu konuda da gösterebilirdiniz çünkü fazla bir farkı olduğunu düşünmüyorum sonuçta yarışma bu.

acehreli
21/03/2008, 03:43
Daha once karsilasmadigimiz icin henuz bir fikir olusmadi herhalde. Odev sorulari artik forum kurali olarak geciyor ama daha once de ricadan ote bir sey yapilmiyordu.

Bu noktadan sonra kapatmak da simdiye kadar gorenlere avantaj saglamis olur herhalde.

Ali