Nguồn đề bài: http://vn.spoj.com/problems/MAXARR1/
1. Đề bài MAXARR1 spoj
Năm ngoái Conan chỉ mới bước vào học Tin học thật sự. Thế nhưng anh ta bị đàn em là Như Quỳnh thách đố bài toán sau:
Cho T ≤ 100000. Mỗi dòng của T có 1 số N (N ≤ 100000). Dãy số A được xây dựng như sau:
- A[0] = 0
- A[1] = 1
- A[2i] = A[i]
- A[2i+1] = A[i] + A[i+1]
Nhiệm vụ của bạn là tìm số lớn nhất của dãy A từ 1 với N.
Input
Dòng đầu tiên là số T.
T dòng sau, mỗi dòng là 1 số N.
Output
Có T dòng tương ứng với giá trị lớn nhất của các đoạn.
Example
Input
2
5
10
Output
3
4
2. Thuật toán MAXARR1 spoj
Bài này không có gì để nói đến, dùng QHĐ bình thường thôi. Có thể vừa nhập vừa xử lí hoặc nhập xong rồi xử lí sau.
3. code tham khảo MAXARR1 spoj
Các bạn có thể tham khảo các cách viết sau
solution mẫu (2 code pascal, 1 code c++):
uses math; const fi=''; nmax=1000000; type data=longint; var f:text; n:data; A,Amax:array[0..nmax+1] of word; procedure xuli; var i:data; begin for i:=1 to 500000 do begin A[2*i]:=a[i]; amax[i*2]:=max(a[i*2],amax[i*2-1]); a[2*i+1]:=a[i]+a[i+1]; amax[i*2+1]:=max(a[i*2+1],amax[i*2]); end; end; procedure docfile; var i,x:data; begin assign(f,fi); reset(f); readln(f,n); A[0]:=0; A[1]:=1; amax[0]:=0; amax[1]:=1; xuli; for i:=1 to n do begin readln(f,x); writeln(Amax[x]); end; close(f); end; begin docfile; end.
+++
USES math; CONST maxn = 100000; VAR t,i,j,m : longint; a,f : array[0..maxn] of int64; n : array[1..maxn] of longint; BEGIN readln(t); m := 0; for i := 1 to t do begin readln(n[i]); m := max(n[i],m); end; a[0] := 0; a[1] := 1; for i := 1 to m div 2 do begin a[2*i] := a[i]; a[2*i+1] := a[i] + a[i+1]; end; f[1] := 1; for i := 2 to m do f[i] := max(f[i-1],a[i]); for i := 1 to t do writeln(f[n[i]]); END.
c++
#include <stdio.h> #include <algorithm> using namespace std; int a[100002],amax[100002]; void xuli() { a[0]=amax[0]=0; a[1]=amax[1]=1; int i; for (i=1; i<=50000; i++) { a[i*2]=a[i]; amax[i*2]=max(a[i*2],amax[i*2-1]); a[2*i+1]=a[i]+a[i+1]; amax[2*i+1]=max(a[i*2+1],amax[i*2]); } } int main() { int test; xuli(); scanf("%d",&test); int i,x; for (i=1; i<=test; i++ ) { scanf("%d",&x); printf("%dn",amax[x]); } return 0; }
C++ nhớ dùng scanf vs printf nha! cin cout là k full đâu! <3