QBMAX – spoj

Đề bài:

Thuật toán:

  • Quy hoạch động!

Code:

uses    math;
const   fi = '';
        fo = '';
var     n,m,i,j,maxf : integer;
        a,f : array[0..301,0..301] of integer;

begin
        assign(input,fi);
        reset(input);
        assign(output,fo);
        rewrite(output);
        readln(m,n);
        for i := 1 to m do
                for j := 1 to n do
                        read(a[i,j]);
        for j := 0 to n+1 do begin
                f[0,j] := -maxint;
                f[m+1,j] := -maxint;
        end;
        for i := 1 to m do f[i,1] := a[i,1];
        for j := 2 to n do
                for i := 1 to m do
                        f[i,j] := max(f[i-1,j-1],max(f[i,j-1],
                                       f[i+1,j-1])) + a[i,j];
        maxf := -maxint;
        for i := 1 to m do
                maxf := max(maxf,f[i,n]);
        writeln(maxf);
        close(input);
        close(output);
end.

LIS – SPOJ

Đề bài:

Thuật toán:

  • for lồng với chặt nhị phân mất tốc độ O(n)log(n)
  • các bạn xem code thắc mắc đâu thì hỏi thêm nha

Code:

program         LIS;
var     a,l:array[1..30000] of longint;
        d,i,dau,cuoi,mid,n:longint;
begin
        readln(n);
        for i:=1 to n do read(a[i]);
        d:=1;
        l[1]:=1;
        for i:=2 to n do
                begin
                        if a[i]>a[l[d]] then
                                begin
                                        inc(d);
                                        l[d]:=i;
                                end
                        else
                                begin
                                        dau:=1;
                                        cuoi:=d;
                                        while dau <= cuoi do
                                                begin
                                                        mid:=(dau+cuoi) div 2;
                                                        if a[i]>a[l[mid]] then dau:=mid+1
                                                        else cuoi:=mid-1;
                                                end;
                                        l[dau]:=i;
                                end;
                end;
        write(d);
end.

MDIGITS2 – spoj

Đề bài:

Thuật toán:

  • Bạn chỉ cần tạo 1 xâu st[] với thứ tự các số tự nhiên như đề bài nhé.
  • Các bạn xem code của mình để dễ hiểu hơn nhé

Code:

Var
  n :Int64;

  function Solve :Int64;
  var
    S,T,X :AnsiString;
    i :Int64;
  begin
    S:=''; Str(n,X); i:=1;
    while i<=n do
      begin
        Str(i,T); S:=S+T; Inc(i);
      end;
    Solve:=Pos(X,S);
  end;

Begin
  Assign(Input,''); Reset(Input);
  Assign(Output,''); Rewrite(Output);
  ReadLn(n);
  Write(Solve);
  Close(Input); Close(Output);
End.

QBHV – spoj

Đề bài:

Thuật toán:

  • Sắp xếp các kí tự trong xâu S tăng dần theo thứ tự bảng chữ cái Alphabet.
  • Quay lui liệt kê các hoán vị của xâu S, với mỗi hoán vị mới sinh ra kiểm tra xem có trùng với xâu vừa viết ra hay không.

Code:

Const
  maxN =9;
  maxSL =362880;
Var
  n,m :LongInt;
  S,X :String[9];
  D :Array['A'..'Z'] of ShortInt;
  A :Array[0..maxSL] of String[9];
  Free :Array[1..maxN] of Boolean;

  procedure QSort(l,r :LongInt);
  var
    i,j :LongInt;
    Key,Tmp :Char;
  begin
    if (l>=r) then Exit;
    i:=l; j:=r; Key:=S[(l+r) div 2];
    repeat
      while (S[i]Key) do Dec(j);
      if (i<=j) then
        begin
          if (ij);
    QSort(l,j); QSort(i,r);
  end;

  function Factorial(i :LongInt) :LongInt;
  var
    j,tmp :LongInt;
  begin
    if (i=0) then Exit(1);
    tmp:=1;
    for j:=2 to i do tmp:=tmp*j;
    Exit(tmp);
  end;

  procedure Enter;
  var
    i,tmp :LongInt;
    ch :Char;
  begin
    ReadLn(S); n:=Length(S); QSort(1,n);
    FillChar(D,SizeOf(D),0);
    FillChar(Free,SizeOf(Free),true);
    for i:=1 to n do Inc(D[S[i]]);
    X:='';
    for i:=1 to n do X:=X+' ';
    tmp:=1;
    for ch:='A' to 'Z' do tmp:=tmp*Factorial(D[ch]);
    WriteLn(Factorial(n) div tmp);
    A[0]:='';
    m:=0;
  end;

  procedure Back(i :LongInt);
  var
    j :LongInt;
  begin
    for j:=1 to n do
      if (Free[j]) then
        begin
          X[i]:=S[j];
          Free[j]:=false;
          if (i=n) and (X>A[m]) then
            begin
              WriteLn(X); Inc(m); A[m]:=X;
            end
          else Back(i+1);
          Free[j]:=true;
        end;
  end;

Begin
  Assign(Input,''); Reset(Input);
  Assign(Output,''); Rewrite(Output);
  Enter;
  Back(1);
  Close(Input); Close(Output);
End.

PNUMBER- spoj

Đề bài:

Thuật toán:

  • bạn chỉ cần tạo hàm kiểm tra số nguyên tố thôi nhé.
  • hàm mình tạo ở dưới code này. Các bạn đọc để dễ hiểu hơn nhé.

Code:

#include
using namespace std;
int a,b;
int kt(int n)
{
    if(n<2) return 0;
    for (int i=2;i<=sqrt(n);i++)
      if (n%i==0)
           return 0;
return 1;
}
 int main()
{ cin>>a>>b;
    for (int j=a;j<=b;j++)
    {
        if(kt(j)) cout<
  • Phần int kt(int n) chính là hàm kiểm tra số nguyên tố mà mình đã nói ở trên nhé ^_^
  • COUNTCBG – spoj

    Đề bài:

    Thuật toán:

    • Ta xét tổng các số từ l -> r thì ta cần tìm l , r sao cho :l + (l+1) + … + (r-1) + r = n

      ⇒ (r+l)(r-l+1)/2 = n

      ⇒ (l+r)(r-l+1) = 2n

      Giải phương trình nghiệm nguyên đơn giản này

      Ta xét phần (l+r). Đương nhiên l + r >= 2 vì l >= 1, r >= l;

      Do l <= r nên ta chỉ cần xét (l + r) từ 2 -> sqrt(2n) thôi vì phần còn lại sẽ tạo ra bộ nghiệm tương tự phần ta xét

      Cho i = 2 -> sqrt(2n) :

      Nếu (2n) chia hết cho i thì ta bắt đầu :

      l + r = i và r – l + 1 = 2n/i hay r – l = 2n/i -1

      ⇒ 2r = i + 2n/i -1 mà r nguyên

      ⇒ (i + 2n/i – 1) chẵn

      ⇒ l cũng nguyên do r nguyên

      Vậy điều kiện để có một nghiệm cho bài toán là

      (2n) chia hết cho i và (i + 2n / i – 1) chẵn

      Nhận xét thời gian thực thi thuật toán là :

      O(100*sqrt(2*10^9))

    Code:

    Program COUNTCBG;
    Var
      n,res :LongInt;
    
      procedure Solve;
      var
        i :LongInt;
      begin
        res:=0;
        for i:=2 to Trunc(Sqrt(2*n)) do
          if (2*n mod i=0) then
            if ((i+2*n div i-1) mod 2=0) then Inc(res);
      end;
    
    Begin
      Assign(Input,''); Reset(Input);
      Assign(Output,''); Rewrite(Output);
      while not EoF do
        begin
          ReadLn(n);
          Solve;
          WriteLn(res);
        end;
      Close(Input); Close(Output);
    End.
    
    

    BASEH – spoj

    Đề bài:

    Thuật toán:

    • Chuyển n về hệ nhị phân
    • Các bạn có thể tham khảo code sau

    Code:

    #include
    using namespace std;
    int main()
    {
        long long  a[10000005], n,dem=0,k;
        cin>>n>>k;
        while(n>0)
        {
                   a[dem] = n%2;
                   n = n/2;
                   dem++;
        }
        for(long long  i=dem-1; i>=0;i--)
        cout<
    

    Top 5 trường đại học tốt nhất để học công nghệ thông tin

    Nếu bạn chọn theo học ngành CNTT nhưng vẫn chưa chọn được trường đại học thì bài viết này là dành cho bạn. Dưới đây là những trường đại học tốt nhất để học CNTT.

    Đại học Bách khoa Hà Nội

    Đây là một trong những nơi đào tạo ngành công nghệ thông tin đầu tiên trên cả nước. Với lịch sử lâu đời và bề dày kinh nghiệm, kỹ sư Bách Khoa vẫn là luôn được xã hội đánh giá cao.

    Viện Công nghệ thông tin và Truyền thông gồm các đơn vị trực thuộc sau:

    * Khối các đơn vị giảng dạy

    – Bộ môn Công nghệ phần mềm

    – Bộ môn Hệ thống thông tin

    – Bộ môn Khoa học máy tính

    – Bộ môn Kỹ thuật máy tính

    – Bộ môn Mạng và truyền thông

    – Trung tâm máy tính

    – Chương trình đào tạo Việt Nhật (dự án HEDSPI)

    – Các phòng thí nghiệm phục vụ công tác đào tạo

    * Trung tâm nghiên cứu, phát triển và ứng dụng CNTT-TT

    – PTN Công nghệ phần mềm và Quản trị CNTT

    – PTN Công nghệ tri thức và dữ liệu

    – PTN Công nghệ mạng và Truyền thông

    – PTN Thiết kế hệ nhúng và ứng dụng

    – PTN Công nghệ tính toán, đa phương tiện và mô phỏng

    Địa chỉ viện: https://soict.hust.edu.vn/

    Đại học Công Nghệ – ĐHQGHN

    Đại học Công nghệ nổi bật với chất lượng đào tạo hàng đầu về CNTT kể cả giáo dục mũi nhọn, với các thầy cô trong khoa đều là các giáo sư, tiến sĩ đầu ngành. Trong các kỳ thi CNTT trong nước, Đại học Công nghệ luôn đứng ở những top đầu.

    Sinh viên Đại học Công nghệ rất năng động. Vào đây bạn sẽ được dạo quang khuôn viên của ĐHQGHN vô cùng đẹp và ở cạnh rất nhiều đại học khác.

    Địa chỉ khoa: http://fit.uet.vnu.edu.vn/

    Trường Đại học Khoa học Tự nhiên, ĐHQG-HCM

    Trường ĐH KHTN là trung tâm đào tạo đại học, sau đại học, cung cấp nguồn nhân lực, đội ngũ chuyên gia trình độ cao trong các lĩnh vực khoa học cơ bản, khoa học liên ngành, khoa học công nghệ mũi nhọn, có năng lực sáng tạo, làm việc trong môi trường cạnh tranh quốc tế; là nơi thực hiện những nghiên cứu khoa học đỉnh cao tạo ra các sản phẩm tinh hoa đáp ứng nhu cầu phát triển KHCN và yêu cầu phát triển kinh tế – xã hội ngày càng cao của đất nước, phù hợp với xu thế phát triển thế giới.

    Trường Đại học FPT

    Là một trường Đại học tư thục tại Việt Nam, thuộc tập đoàn công nghệ FPT. Học ở đây bạn sẽ có cơ hội học tập rất thực tiễn và tiếp xúc nhiều với doanh nghiệp, cơ hội việc làm sau khi ra trường là khá cao.

    Trường cáo đào tạo một số ngành: Kỹ thuật phần mềm, Khoa học máy tính, An toàn thông tin.

    Trở thành lập trình viên chuyên nghiệp từ một tay chơi poker – Haseeb Qureshi

    Hôm nay mình sẽ kể cho các bạn nghe về câu chuyện về Haseeb Qureshi. Anh từ một tay chơi Poker chuyên nghiệp đến một nhà lập trình viên xuất sắc, nhận được 8 offer của các công ty lớn trong đó có Google, Uber, Airbnb…

    yeulaptrinh.pw

    Haseeb Qureshi chơi Poker từ năm 16 tuổi, anh nhanh chống trở thành một trong những người chơi Poker đẳng cấp thế giới và kiếm được khá nhiều tiền. Năm 21 tuổi, sau một scandal xảy ra trong nghề nghiệp của mình, anh quyết định từ bỏ việc chơi Poker.

    Trở về nhà, anh dành nhiều thời gian suy ngẫm về quá khứ của mình, sau đó hoàn tất việc học Anh Ngữ/Triết Học của mình tại The University of Texas. Tháng 12/2013 Haseed cho ra đời quyển sách “How to Be a Poker Player: The Philosophy of Poker” và nó nhanh chống trở thành một trong những quyển sách viết về Poker bán rất chạy thời đó.

    Tuy nhiên Haseeb cảm thấy thật sự không hạnh phúc, ông quyên góp toàn bộ số tiền mình kiếm được cho từ thiện và cho gia đình mình, anh giữ lại 10.000 USD để học những gì mình yêu thích.

    Năm 2014 Haseed bắt đầu dấn thân vào ngành công nghiệp công nghệ cao, anh chọn Công Nghệ Thông Tin là bước đi tiếp theo của mình. Anh bắt đầu tự học thêm kiến thức cho mình. Để đi một con đường mới là không hề dễ dàng và Haseed lên kế hoạch và lộ trình học tập cho riêng mình.

    Sau đây là từng bước chiến lược học tập của Haseed, mình xin chia sẽ với các bạn:
    ————-
    1. Tham gia khóa học Thuật Toán miễn phí trên Coursera “Princeton Coursera course on algorithms”
    Link: https://www.coursera.org/learn/algorithms-part1.

    2. Đọc quyển “The Algorithm Design Manual” của Steven S Skiena để bổ sung các kiến thức nền tảng về Cấu Trúc Dữ Liệu và Giải Thuật.

    3. Đọc quyển “Cracking the Coding Interview” Gayle Laakmann McDowell để lấy kinh nghiệm và lên chiến lược Interview phù hợp.

    4. Nghe thường xuyên các tin tức về Software Engineering trên các trang như:
    – Software Engineering Daily: http://softwareengineeringdaily.com/category/podcast/
    – The Bike Shed: http://bikeshed.fm/
    – Đọc tên tin tức tại Hacker News: https://news.ycombinator.com/

    Theo Haseed thì có thể ban đầu việc nghe sẽ rất khó khăn với bạn nhưng bạn chỉ nghe thôi không cần hiểu dần dần bạn sẽ quen. Việc Nghe tin tức về lĩnh vực bạn sẽ giúp bạn nắm bắt nhanh các xu thế CNTT hiện nay, quen dần với các thuật ngữ phổ biến bằng Tiếng Anh trong CNTT và đó cũng là cách để bạn có thể nói chuyện với các Developer khác một cách chuyên nghiệp.

    5. Về phần System Design and Architecture, Haseed khuyên bạn nên đọc các kiến thức tại:
    – HiredInTech: http://www.hiredintech.com/system-design
    – High Scalability: http://highscalability.com/all-time-favorites/
    ————–

    Sau đó Haseed tham dự bootcamp một khóa học ngắn hạn (12 tuần) để Review lại kiến thức của mình tại App Academy. Với Haseed điều quan trọng nhất là bạn phải “study study study” và không được nản chí. Anh là người thường xuyên đến sớm nhất và về trể nhất trong các buổi học.

    Năm 2016 là năm thành công rực rỡ của Haseed anh nhận được 8 lời mời làm việc tại Google, Uber, Yelp, and Airbnb… Sau đó anh quyết định gia nhập Airbnb và hiện nay đang là kỹ sư phần mềm quan trọng của Airbnb.

    Haseed là tấm gương điển hình mà chúng ta nên lấy đó là động lực để phấn đấu. Mình hi vọng những chia sẽ này sẽ giúp ích cho các bạn.

    Tác giả: thầy Phạm Nguyễn Sơn Tùng – HCMUS

    NDCCARD – spoj

    Đề bài:

    Thuật toán:

    • Dùng mảng f[i] đánh dấu giá trị lớn nhất <= i trong dãy A.
    • Vậy nên các cặp 3 số là a[i], a[j], f[m-a[i]-a[j]].
    • Chú ý đề bài cho dãy A đôi một khác nhau nhé.

    Code:

    #include 
    
    using namespace std;
    
    const int oo = 500001;
    const int MAXN = 10001;
    int i, j, n, m, a[MAXN], tmp, res, f[oo];
    
    int main() {
        cin >> n >> m;
        for (int i = 1; i <= n; i++) cin >> a[i];
        sort(a+1,a+n+1);
        tmp = 0;
        for (int i = a[1]; i <= m; i++) {
            if ((tmp < n) && (i >= a[tmp+1])) tmp++;
            f[i] = a[tmp];
        }
        for (int i = 1; i<= n-2; i++) {
            for (int j = i+1; j <= n-1; j++) {
                tmp = m - a[i] - a[j];
                if (tmp < 1) continue;
                tmp = f[tmp];
                if (tmp <= a[j]) continue;
                res = max(res, a[i] + a[j] + tmp);
            }
        }
        cout << res;
        return 0;
    }
    
    CONST fin='';
         fout='';
    VAR res, i, j, n, m, x, min: longint;
        a, ok: array[1..1000000] of longint;
        f: text;
    BEGIN
      Assign(f,fin);
      Reset(f);
      Readln(f,n,m);
      min:=maxlongint-1;
      For i:=1 to n do
        Begin
          Read(f,a[i]);
          ok[a[i]]:=a[i];
          If a[i]0 then
              Begin
                If (ok[x]<>a[i]) and (ok[x]<>a[j]) and (ok[i]<>0) then
                  If a[i]+a[j]+ok[x]>res then res:=a[i]+a[j]+ok[x];
              End;
          End;
      Assign(f,fout);
      Rewrite(f);
      Writeln(f,res);
      Close(f);
    END.