Diberikan urutan bilangan bulat menemukan jumlah terbesar dari urutan (bilangan bulat pada posisi berurutan) dari urutan. Urutan selanjutnya bisa kosong (dalam hal ini jumlahnya adalah 0).
Input dibaca dari input standar, satu bilangan bulat per baris. Jumlah terbesar harus ditulis ke output standar.
Saya menulis generator kecil untuk Anda:
#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;
}
Contoh:
$ 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
adalah solusi saya./a.out
adalah generatornya
Solusi Anda harus berjalan dalam waktu yang wajar untuk semua tes di atas (milik saya berjalan di 1.2s pada kasus tes terakhir).
Kode terpendek menang.
Sunting : Berikan contoh yang dijalankan pada salah satu tes di atas.
code-golf
subsequence
Alexandru
sumber
sumber
#include <stdlib.h>
untukatoi()
.while (i--);
tidak seharusnya diakhiri dengan tanda titik koma, bukan?Jawaban:
Ruby, 53 karakter
Butuh waktu sekitar 28 detik untuk testcase terakhir di sini.
sumber
Python,
918464 karakterMemakan waktu sekitar
141272 detik pada test case terakhir. Sunting: menggunakan algoritma yang ditemukan Paul R. Sunting: mem-nix impor, menggunakaninput()
.sumber
C, 100 karakter
Jalankan waktu = 1,14 dtk untuk test case akhir (10000000) pada 2,67 GHz Core i7 dengan ICC 11.1 (sebelumnya: 1,44 dtk dengan gcc 4.2.1).
Catatan: Algoritma yang digunakan untuk solusi di atas berasal dari Pemrograman Mutiara oleh Jon Bentley. Tampaknya algoritma ini dikenal sebagai Algoritma Kadane .
sumber
Haskell (
8864)Menerapkan algoritma Kadane.
sumber
Python - 114 karakter
Ini tentu saja tidak secepat yang diminta, tetapi bekerja dengan baik.
sumber
Python, menggunakan pemrograman dinamis - 92 karakter
sumber
J (
3433 karakter)Solusi ini mengimplementasikan varian dari algoritma Kadane dan cepat masuk akal.
Berikut ini penjelasannya:
u/ y
- Kata kerjau
disisipkan di antara item dariy
. Misalnya,+/ 1 2 3 4
seperti1 + 2 + 3 + 4
. Perhatikan bahwa semua kata kerja dalam J terkait-benar, yaitu,-/ 1 2 3 4
seperti1 - (2 - (3 - 4))
dan menghitung jumlah bolak-balik dari1 2 3 4
.x >. y
- maksimumx
dany
.x ([ >. +) y
- Maksimal darix
danx + y
.[ >. +
adalah kata kerja dalam notasi diam-diam dan dievaluasi sama denganx >. x + y
.([ >. +)/ y
- awalan non-kosongy
dengan jumlah terbesar.u\. y
-u
diterapkan untuk semua sufiksy
. Perhatikan bahwa kode khusus menangani kasus umumu/\. y
sehingga ini berjalan secara linier, bukan waktu kuadratik.([ >. +)/\. y
- Vektor yang menunjukkan subarray non-kosong terbesar yang dimulai pada setiap posisiy
.0 , ([ >. +)/\. y
-0
Dipersiapkan untuk hasil sebelumnya seperti0
panjang subarray kosongy
.>./ 0 , ([ >. +)/\. y
- Subarray terbesar dariy
.0 ". ];._2 (1!:1) 3
- Input standar disusun menjadi vektor angka.>./ 0 , ([ >. +)/\. 0 ". ];._2 (1!:1) 3
- Subarray terbesar dalam input standar.sumber
Ruby, 68 karakter
Juga agak lambat, tetapi menyelesaikan tes 1-10000000 dalam sedikit lebih dari setengah menit, sebagian besar waktu dihabiskan di tes terakhir ...
Versi indentasi:
sumber
C ++, 192 karakter
Bekerja cukup cepat di laptop saya (4 detik untuk tes terakhir).
sumber
cstdlib
notstdlib.h
Kode awk (66) , sangat lambat, 8+ detik untuk test case terakhir
sumber