অনুচ্ছেদের বৃহত্তম যোগফলটি সন্ধান করুন


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.2 দশকে চলেছে)।

সংক্ষিপ্ততম কোড জিতেছে।

সম্পাদনা করুন : দয়া করে উপরের পরীক্ষাগুলির মধ্যে একটিতে চালিত উদাহরণ সরবরাহ করুন।


আপনি প্রয়োজন #include <stdlib.h>জন্য atoi()
পল আর

আমার নিজের সি দ্রবণটি শেষ পরীক্ষার ক্ষেত্রে 4 সেকেন্ড সময় নেয়, আপনার সমাধান সম্পর্কে খুব আগ্রহী।
দংশেংসিএন

নিশ্চিত করুন যে আপনি প্রথমে কোনও ফাইলে লিখেছেন এবং তারপরে ফাইলটি পড়েছেন, এবং পাইপ ব্যবহার করছেন না।
আলেকজান্দ্রু

আমি অনুমান করি যে আপনার জেনারেটরে একটি ত্রুটি আছে, 25 লাইন, while (i--);সেমিকোলনে শেষ হওয়া উচিত নয়, এটি করা উচিত?
ব্যবহারকারী অজানা

assert (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);}


আইসিসি ১১.১.১ সহ পূর্ববর্তী ২.6767 গিগাহার্জ কোর আই on এ চূড়ান্ত পরীক্ষার মামলার জন্য (10000000) রান করার সময় = 1.14 s (পূর্বে: জিসিসি 4.2.1 সহ 1.44 এস )।

দ্রষ্টব্য: উপরের সমাধানের জন্য ব্যবহৃত অ্যালগরিদমটি জন বেন্টলির প্রোগ্রামিং পার্ল থেকে এসেছে । স্পষ্টতই এই অ্যালগরিদম কাদেনের অ্যালগোরিদম হিসাবে পরিচিত ।


3

হাস্কেল ( 88 )

কাদনের অ্যালগরিদম বাস্তবায়ন করা হচ্ছে।

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:])`

এটি অবশ্যই প্রয়োজনীয় হিসাবে দ্রুত নয়, তবে এটি ঠিক কাজ করে।


এটি ও (এন ^ 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- আইটেমগুলির মধ্যে ক্রিয়াটি serted 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 - বৃহত্তম বৃহত্তম subarray y
  • 0 ". ];._2 (1!:1) 3 - স্ট্যান্ডার্ড ইনপুট সংখ্যার ভেক্টরে মার্শাল করা।
  • >./ 0 , ([ >. +)/\. 0 ". ];._2 (1!:1) 3 - স্ট্যান্ডার্ড ইনপুট বৃহত্তম subarray।

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 কোড (aw 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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.