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


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.