सबसे बड़ी राशि का पता लगाएं


11

पूर्णांक के अनुक्रम को देखते हुए अनुक्रम के बाद के क्रम (लगातार पदों पर पूर्णांक) की सबसे बड़ी राशि पाते हैं। बाद में रिक्त हो सकता है (जिस स्थिति में योग 0 है)।

इनपुट को मानक इनपुट, प्रति पंक्ति एक पूर्णांक से पढ़ा जाता है। सबसे बड़ा योग मानक आउटपुट के लिए लिखा जाना चाहिए।

मैंने आपके लिए एक छोटा जनरेटर लिखा है:

#include <stdio.h>
#include <assert.h>


/* From http://en.wikipedia.org/wiki/Random_number_generation */
unsigned m_w;
unsigned m_z;

unsigned get_random()
{
  m_z = 36969 * (m_z & 65535) + (m_z >> 16);
  m_w = 18000 * (m_w & 65535) + (m_w >> 16);
  return (m_z << 16) + m_w;  /* 32-bit result */
}

int main(int argc, char **argv)
{
  int i;

  assert(argc == 3);
  m_w = atoi(argv[1]);
  m_z = atoi(argv[2]);

  i = 10;
  while (i--);
    get_random();

  i = atoi(argv[2]);
  while (i--)
    printf("%d\n", (int) get_random() << 8 >> 22);

  return 0;
}

उदाहरण:

$ printf "1\n2\n-1\n4\n" | ./sum
6
$ printf "0\n-2\n-3\n" | ./sum
0

$ ./a.out 1 1 | ./sum
387
$ ./a.out 1 10 | ./sum
571
$ ./a.out 1 100 | ./sum
5867
$ ./a.out 1 1000 | ./sum
7531
$ ./a.out 1 10000 | ./sum
27268
$ ./a.out 1 100000 | ./sum
101332
$ ./a.out 1 1000000 | ./sum
187480
$ ./a.out 1 10000000 | ./sum
666307
  • ./sum मेरा समाधान है
  • ./a.out जनरेटर है

आपके समाधान को ऊपर दिए गए सभी परीक्षणों के लिए उचित समय में चलना चाहिए (मेरा अंतिम परीक्षण मामले पर 1.2s में चलता है)।

सबसे छोटा कोड जीतता है।

संपादित करें : कृपया ऊपर दिए गए परीक्षणों में से एक पर एक उदाहरण प्रदान करें।


आप के लिए की जरूरत #include <stdlib.h>है atoi()
पॉल आर।

मेरा अपना सी समाधान अंतिम परीक्षण के मामले में 4 सेकंड लेता है, आपके समाधान के बारे में बहुत दिलचस्पी है।
Dongshengcn

सुनिश्चित करें कि आप पहले किसी फ़ाइल पर लिखते हैं और फिर फ़ाइल से पढ़ते हैं, और पाइप का उपयोग नहीं करते हैं।
अलेक्जेंड्रू

मुझे लगता है कि आपके जनरेटर में एक त्रुटि है, लाइन 25, while (i--);अर्धविराम में समाप्त नहीं होनी चाहिए, क्या यह होना चाहिए?
उपयोगकर्ता अज्ञात

मुखर (argc == 3) :-) मैं एक उपयोगकर्ता के अनुकूल कार्यक्रम कहता हूं! :-)
इमानुएल लैंडहोम

जवाबों:


3

रूबी, 53 वर्ण

p$<.inject(-1.0/s=0){|a,b|[s=[0,s+b.to_i].max,a].max}

यहां आखिरी टेस्टकेस के लिए लगभग 28 सेकंड लगते हैं।


6

पायथन, 91 84 64 चार्ट

s=m=0
try:
 while 1:s=max(s+input(),0);m=max(m,s)
except:print m

अंतिम परीक्षण मामले पर लगभग 14 12 72 सेकंड लेता है । संपादित करें: एल्गोरिथ्म का उपयोग करते हुए पॉल आर मिला। संपादित करें: आयात का उपयोग करते हुए, निक्स किया input()


6

सी, 100 वर्ण


main(){char s[80];int i,m=0,n=0;while(gets(s)){i=atoi(s);n=n+i>0?n+i:0;m=m>n?m:n;}printf("%d\n",m);}


ICC 11.1 के साथ 2.67 गीगाहर्ट्ज़ कोर i7 पर अंतिम परीक्षण मामले (10000000) के लिए रन समय = 1.14 s (पहले: gcc 4.2.1 के साथ 1.44 s )।

नोट: उपरोक्त समाधान के लिए उपयोग किया जाने वाला एल्गोरिथ्म जॉन बेंटले द्वारा प्रोग्रामिंग पर्ल से आता है । जाहिरा तौर पर इस एल्गोरिथ्म को कडाने के एल्गोरिथ्म के रूप में जाना जाता है ।


3

हास्केल ( 88 64)

कडाने के एल्गोरिथ्म को लागू करना।

main=interact$show.maximum.scanr(\x->max x.(x+))0.map read.lines

2

पायथन - 114 वर्ण

import sys
s=map(int,sys.stdin.readlines())
l=range(len(s)+1)
print`max(sum(s[i:j])for i in l[:-1]for j in l[i:])`

यह निश्चित रूप से आवश्यक के रूप में उपवास नहीं है, लेकिन यह सर्वथा काम करता है।


यह O (N ^ 2) है जो निश्चित रूप से चुनौती की आवश्यकताओं को पूरा नहीं करता है।
अलेक्जेंड्रू

2

पायथन, गतिशील प्रोग्रामिंग का उपयोग करते हुए - 92 वर्ण

import sys
s=map(int,sys.stdin.readlines())
f=h=0
for x in s:h=max(0,h+x);f=max(f,h)
print f

2

जे ( 34 33 अक्षर)

यह समाधान कडाने के एल्गोरिथ्म के एक प्रकार को लागू करता है और उचित तेज है।

echo>./0,([>.+)/\.0".];._2(1!:1)3

यहाँ एक स्पष्टीकरण है:

  • u/ y- की वस्तुओं के बीच u डाली गई क्रिया y। जैसे, +/ 1 2 3 4वैसा है 1 + 2 + 3 + 4। सूचना है कि जम्मू में सभी क्रियाओं को राइट-जुड़े रहे हैं, यह है कि, -/ 1 2 3 4की तरह है 1 - (2 - (3 - 4))और की बारी योग की गणना करता है 1 2 3 4
  • x >. y- की अधिकतम xऔर y
  • x ([ >. +) y- की अधिकतम xऔर x + y[ >. +मौन संकेतन में एक क्रिया है और उसी के रूप में मूल्यांकन करता है x >. x + y
  • ([ >. +)/ y- yसबसे बड़ी राशि के साथ गैर-खाली उपसर्ग ।
  • u\. y- uके सभी प्रत्ययों पर लागू होता है y। ध्यान दें कि विशेष कोड सामान्य मामले को संभालता है u/\. yजैसे कि यह द्विघात समय के बजाय रैखिक में चलता है।
  • ([ >. +)/\. y- एक वेक्टर जो सबसे बड़ी गैर-रिक्त उपप्रकार को दर्शाता है जो प्रत्येक स्थिति में शुरू होता है y
  • 0 , ([ >. +)/\. y- 0पिछले परिणाम से पहले 0जैसा कि खाली उपश्रेण की लंबाई है y
  • >./ 0 , ([ >. +)/\. y- की सबसे बड़ी सबरेरी y
  • 0 ". ];._2 (1!:1) 3 - मानक इनपुट संख्याओं के एक वेक्टर में marshalled।
  • >./ 0 , ([ >. +)/\. 0 ". ];._2 (1!:1) 3 - मानक इनपुट में सबसे बड़ा सबर्रे।

1

रूबी, 68 वर्ण

m=-2**31;n=0;$<.lines.map{|x|n+=x.to_i;n=0 if n<0;m=n if n>m};puts m

थोड़ा धीमा भी, लेकिन 1-10000000 परीक्षणों को आधे मिनट से कुछ अधिक समय में पूरा करता है, अधिकांश समय अंतिम परीक्षा में ...

प्रस्तुत संस्करण:

m=-2**31
n=0
$<.lines.map {|x|
  n+=x.to_i
  n=0 if n<0
  m=n if n>m
}
puts m

1

सी ++, 192 वर्ण

#include <iostream>
#include <string>
#include <stdlib.h>
#define S std::
main(){long a=0,m=0,M=0;char s[9];while(S cin.getline(s,9)){a+=atoi(s);if(m>a)m=a;if(M<a-m)M=a-m;}S cout<<M<<S endl;}

मेरे लैपटॉप पर उचित रूप से तेजी से काम करता है (अंतिम परीक्षण के लिए 4 सेकंड)।


cstdlibनहींstdlib.h
Oldrinb

1
{if((r+$1)>0)
   r=r+$1 
 else r=0; 
 if(m<r) 
   m=r;
}
END{print m}

awk कोड (66) , अंतिम परीक्षण मामले के लिए बहुत धीमा, 8+ सेकंड

dwang@dwang-ws ~/Playground/lss $ time ./random 1 10000000 | awk -f lss.awk
666307

real    0m6.705s
user    0m8.671s
sys 0m0.052s
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.