2015-12-25 4 views
6

यदि निम्न Spoj से समस्या का एक कार्यान्वयन है: - http://www.spoj.com/problems/COINS/Recursion स्थिति

#include <stdio.h> 

#define ll long long 

ll arr[100000]; 

ll max(ll n) 
{ 
    if(n < 49999)// Doubt 
    { 
     if(!arr[n]) 
      return arr[n] = max(n/2) + max(n/3) + max(n/4); 
     else 
      return arr[n]; 
    } 
    else 
     return max(n/2) + max(n/4) + max(n/3); 
} 


int main() 
{ 
    ll n, c = 0, i; 

    for(i = 0; i < 12; i++) // Also why 12 when the input can be <12 
    { 
     arr[i] = i; 
    } 

    while(scanf("%lld", &n) != EOF) 
    { 
     printf("%lld\n", max(n)); 

    } 

    return 0; 
} 

क्यों अगर हालत n < 49,999 में क्या है?

+0

रेंज:

मैं इस प्रकार कोड थोड़ा बेहतर प्रलेखन और मजबूती से और तेजी से निष्पादन के लिए संशोधित करेगा। –

+0

@ सौरव घोष 4 9 999 विशेष रूप से क्यों? –

+2

मैं सुझाव दूंगा कि आप 50000 लें और मैन्युअल रूप से कार्य करें जो आपके सरणी में होगा। –

उत्तर

2
प्रत्येक संभावना है, पहली 20+ मूल्यों और अधिकतम और न्यूनतम मूल्यों के अलावा अन्य जांच की बिना

एक रिकर्सन की गहराई को कम करें हालांकि डॉलर मूल्य उन पहली 12 प्रविष्टियों के लिए गणना मूल्य के समान नहीं है।

सिक्का मूल्यों के लिए < = 49 999, यह देखने के लिए जांचें कि क्या मूल्य पहले ही गणना की गई है, यदि नहीं तो सिक्का को/2/3/4 मानों में तोड़ दें और उन परिणामी मूल्यों में से प्रत्येक को दोबारा शुरू करें।

यह सीमा मान (4 99 99 9) 100000 तक बढ़ाया जा सकता है क्योंकि यह arr [] सरणी का उपलब्ध आकार है।

प्रीसेटिंग और एआर [] सरणी में बचत, निष्पादन समय को कम करने और रिकर्सन की गहराई को कम करने में मदद करने के लिए है।

सरणी का उपयोग किसी भी पहले गणना किए गए मान (पोस्ट कोड में, 4 9 999 तक) को तुरंत max() फ़ंक्शन द्वारा तुरंत रिकर्सन के बिना वापस किया जा सकता है। मूल्य के

#include <stdio.h> 
#include <stdint.h> 

#define MAX_ARRAY_LEN (100000) 

uint32_t arr[ MAX_ARRAY_LEN ] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11}; 

uint32_t max(uint32_t n) 
{ 
    if(n < MAX_ARRAY_LEN) 
    { // value of 'n' within the range of the learning array arr[] 

     if(!arr[n] && n) 
     { // then learning array arr[] not yet set 
      return arr[n] = max(n/2) + max(n/3) + max(n/4); 
     } 

     else 
     { // else learning array arr[] already set for 'this' value of 'n' 
      return arr[n]; 
     } 
    } 

    else 
    { // value of 'n' is greater than the learning array arr[] 
     return max(n/2) + max(n/4) + max(n/3); 
    } 
} // end function: max 


int main(void) 
{ 
    uint32_t n; 

    int status; 
    while((status = scanf("%u", &n)) == 1 && EOF != status) 
    { 
     if(1000000000 >= n) 
     { 
      printf("%u\n", max(n)); 
     } 

     else 
     { 
      printf(" invalid value entered, must be in the range 0...1 000 000 000\n"); 
     } // end if 
    } // end while 

    return 0; 
} // end function: main 
+0

आपको ऐसा क्यों लगता है कि 3 के बराबर सिक्का वाला कोई व्यक्ति केवल $ 2 प्राप्त करेगा जब वे $ 1 के लिए 1: 1 रूपांतरण दर पर इसका आदान-प्रदान कर सकते हैं? 12 से कम मूल्य के प्रत्येक सिक्का के लिए, उन्हें प्रश्न में कोड में लागू किए गए अनुसार इसे सीधे रूपांतरित करके अधिकतम एक्सचेंज मिलता है। 12 के लायक सिक्के के लिए, वे ⎣12/2⎦ + ⎣12/3⎦ + ⎣12/4⎦ = 13 प्राप्त कर सकते हैं, जैसा कि आप सही ढंग से दिखाते हैं। –

+0

मैंने इस नए उत्तर में संशोधन किए, और एसपीओजे के अनुसार यह सही है। – user3629249

0

जहाँ तक मैं समझता हूँ कि,

व्यक्ति जो कोड लिखने, किसी भी तरह वह पता चला कि (स्वयं) यदि सिक्का कम से कम 12 तो परिणाम ही हो जाएगा। इतना है कि वह 12
का उपयोग

और प्रत्यावर्तन समारोह के बारे में (इनपुट सिक्का = 2 की व्याख्या की जाँच)

के रूप में हम जानते हैं कि हम 1,000,000,000 आकार के साथ सरणी की घोषणा नहीं कर सकते हैं तो वह का प्रयास करने के लिए कुछ अन्य मान (4 99 999) का उपयोग करें जिसमें आकार वह बना सकता है और बाद में एआर [12] = 13 (जहां 12 सिक्का है और 13 परिणाम है) जैसे सिक्का में परिणाम लेते हैं। वह परिणाम प्राप्त कर सकता है बिना सरणी के साथ उस सरणी का उपयोग करके मूल्य [12] (केवल)सिक्का के लिए12.

आशा है कि आप समझें।

मेरी उम्मीद

है आगमन [] में पहले 12 प्रविष्टियों में मदद करने के पूर्व गणना कर रहे हैं:

+0

उत्सुकता यह है कि प्रश्न में सरणी का आकार 100,000 है लेकिन कोड में परीक्षण 100,000 तत्वों के पहले 49,999 के उपयोग को सीमित करता है। यह शायद संपादन का दुर्घटना है - सरणी आकार के लिए 'enum' या '# परिभाषित' मान का उपयोग न करके,' sizeof (arr)/sizeof (arr [0]) 'का उपयोग न करके भाग की वजह से सरणी में तत्व। 'ऑफ-बाय-वन' का एक तत्व भी है: यदि सरणी का आकार 50,000 था, तो सीमा '50000' होनी चाहिए और' <49999' नहीं होनी चाहिए। –

संबंधित मुद्दे