मेरे एल्गोरिदमिक कौशल में सुधार करने की कोशिश करते समय मुझे खुद को निम्नलिखित समस्या में फंस गया है जो संक्षेप में आपको उस समय की अवधि खोजने के लिए कहता है जहां कमरे में अधिकतम संख्या में लोग मौजूद हैं :अतिव्यापी घटनाओं की अधिकतम संख्या की अवधि
https://jutge.org/problems/P27158_en
समाधान मैं इस समस्या को सही ढंग से सभी सार्वजनिक परीक्षण मामलों वेबसाइट द्वारा सुझाए गए के लिए हल के साथ आए हैं, लेकिन यह एक या अधिक छिपा निजी परीक्षण मामलों के लिए विफल रहता है।
मेरा समाधान प्रत्येक ईवेंट के लिए std :: वेक्टर में दो प्रविष्टियों को बचाता है: एक आगमन के लिए और एक छोड़ने के लिए, प्रत्येक में [eventtype, eventtime] शामिल है। फिर घटनाक्रम द्वारा वेक्टर को टाइप करता है, और आखिरकार वेक्टर के माध्यम से उस समय की अवधि निर्धारित करने के लिए लूप करता है जहां मेहमानों की अधिकतम संख्या होती है। मेरे कोड इस प्रकार है:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
enum class EventType {ARRIVE, LEAVE};
struct Event{
int time;
EventType type;
Event(){}
Event(int tm, EventType t) : time(tm), type (t){}
// inline bool operator<(const Event& e) const {return time < e.time || (time == e.time && type==EventType::LEAVE);}
};
bool eventCompare(const Event& e1, const Event& e2) {
if(e1.time < e2.time){
return true;
} else if(e1.time == e2.time) {
if(e1.type == EventType::LEAVE && e2.type == EventType::ARRIVE) {
return true;
} else {
return false;
}
} else {
return false;
}
}
int main()
{
int visits;
int timeStart, timeEnd;
int maxVisits, maxDuration, localMaxVisits, localStartTime, localEndTime, duration;
std::vector<Event> events;
std::vector<Event>::const_iterator it;
// Get each Case from stdin.
// 0 is the special stopping case.
while(cin>>visits && visits!=0) {
events.clear();
// Read all the visits, for each one save two entries to the visits-vector,
// one for the arrival time another for the leaving time.
for(int i=1; i<=visits; ++i){
cin>>timeStart>>timeEnd;
Event eStart(timeStart, EventType::ARRIVE);
Event eEnd(timeEnd, EventType::LEAVE);
events.push_back(eStart);
events.push_back(eEnd);
}
// Sorting the vector so that events are ordered by their arrival time.
// In case two events coincide on arrival time, we place leaving events before arrival events.
std::sort(events.begin(), events.end(), eventCompare);
maxVisits=0;
maxDuration=0;
localMaxVisits=0;
localStartTime=0;
localEndTime=0;
// Loop through the sorted vector
for(it=events.begin(); it!=events.end(); ++it){
// If the event type is arrival
if((*it).type == EventType::ARRIVE) {
// We only reset the localStartTime if there is no
// gap between the last endtime and the current start time
// For example two events 11-13 and 13-15 should be treated as one long event
// with duration 11-15
if(localEndTime < (*it).time) {
localStartTime = (*it).time;
}
localMaxVisits++;
} else { // Event type leave
// Calculate the duration
duration = (*it).time - localStartTime;
// If we have a new max in overlaps or equal overlaps but larger duration than previous
// We save as the global max.
if(localMaxVisits > maxVisits || (localMaxVisits == maxVisits && duration>maxDuration)) {
maxVisits=localMaxVisits;
maxDuration = duration;
}
localMaxVisits--;
localEndTime= (*it).time;
}
}
cout<<maxVisits<<" "<<maxDuration<<endl;
}
return 0;
}
मैं @j_random_hacker से टिप्पणी करने के लिए तदनुसार संशोधित किया है और के रूप में यह छिपा निजी परीक्षण मामलों के लिए पहले किया था कार्यक्रम अब समय सीमा से अधिक नहीं है, लेकिन अब एक फैसले हो जाता है "गलत उत्तर" (केवल निजी परीक्षण मामलों के लिए)। मैं कोशिश करूंगा और पता लगाऊंगा कि एल्गोरिदम त्रुटि क्या हो सकती है। धन्यवाद हर कोई धन्यवाद।
एल्गोरिदम मेरे लिए अच्छा लग रहा है। क्या आपने प्रोफ़ाइल को इतनी देर तक ले लिया है? क्या यह std :: sort() या कुछ और है? या आपने इसे संकलक अनुकूलन के बिना संकलित किया था और उन्होंने अनुकूलित प्रोग्राम के लिए रन टाइम सीमा को गठबंधन किया था? – Heinzi
मैंने निष्पादन को प्रोफ़ाइल करने की कोशिश नहीं की है, लेकिन प्रलेखन खोजना मैंने निष्कर्ष निकाला है कि std :: sort एक वेक्टर को सॉर्ट करने का सबसे तेज़ तरीका होना चाहिए। दूसरे शब्दों में, भले ही मुझे लगता है कि std :: sort बड़े डेटासेट में अपेक्षाकृत लंबा समय लेता है, मुझे नहीं पता कि मुझे किस क्रमबद्ध एल्गोरिदम का उपयोग करना चाहिए। लेकिन आप सही हैं, मुझे जांच करना चाहिए कि कोड का मुख्य भाग मुख्य समय उपभोक्ता है। आपके अन्य प्रश्न के अनुसार, मैं केवल परीक्षण साइट पर स्रोत कोड सबमिट करता हूं, इसलिए मुझे पता नहीं है कि वे किस कंपाइलर सेटिंग्स को संकलित करते हैं और बाद में मेरे प्रोग्राम को निष्पादित करते हैं। – AsbjornF
मुझे लगता है कि 'sort' पहली जगह नहीं होनी चाहिए जिसे आप अपने एल्गोरिदम को तेज़ करने के लिए देख रहे हों। इसके बजाय, मेरा मानना है कि आपके लूप की सामग्री आपके एल्गोरिदम की गति के लिए अधिक महत्वपूर्ण है। हालांकि, जैसा कि हेन्ज़ी ने इंगित किया है, प्रोफाइलिंग निश्चित रूप से आपको आपके एल्गोरिदम की बाधा की पहचान करने में काफी मदद करेगी। – Nard