ACMNB – spoj

Đề bài:

Thuật toán:

Thuật toán có thể suy ra từ cách làm thực tế. Nếu Tí làm tất cả 2n bài sẽ mất tổng thời gian là

12-yeulaptrinh.pwTuy nhiên Tí phải nhường lại n bài cho Tèo. Mỗi khi Tí nhường bài i cho Tèo, thời gian S sẽ giảm đi một lượng ci = ai – bi. Ta cần chọn n bài để Tí nhường cho Tèo sao cho thời gian S giảm đi nhiều nhất, tức là phải chọn n chỉ số i có c lớn nhất.

Code:

CONST   FI='';
        FO='';
        maxn=trunc(1e5)*8;
type    arr1    =array[1..maxn] of longint;
var     n,i,j   :longint;
        a,b,c   :arr1;
        ans     :longint;
procedure enter;
begin
        assign(input,fi);reset(input);
        read(n);
        for i:=1 to 2*n do read(a[i],b[i]);
        close(input);
end;
procedure swap(var x,y:longint);
var     tg      :longint;
begin
        tg:=x;x:=y;y:=tg;
end;
procedure qs(l,r:longint; var a,b,c:arr1);
var     i,j,x,y     :longint;
begin
        i:=l;j:=r;
        x:=a[(l+r) div 2];
        y:=b[(l+r) div 2];
        repeat
                while (x>a[i])  do inc(i);
                while (xj;
        if il then qs(l,j,a,b,c);
end;
procedure process;
begin
        for i:=1 to 2*n do c[i]:=a[i]-b[i];
        qs(1,2*n,c,a,b);
        for i:= 1 to n do
                ans :=  ans+a[i];
        for i:=n+1 to 2*n do
                ans := ans+b[i];
end;
procedure print;
begin
        assign(output,fo);rewrite(output);
        writeln(ans);
        close(output);
end;
begin
        enter;
        process;
        print;
end.

Chọn trình soạn thảo C++ nào?

Hiện tại có rất nhiều trình soạn thảo C++ nhưng để chọn được trình soạn thảo phủ hợp với đặc thù công việc thì cần thời gian dài trải nghiệm và học hỏi… Dưới đây là 9 trình soạn thảo C++ hay còn gọi là IDE tốt nhất do các chuyên gia trên thế giới đánh giá.

1. CLion

Platforms: Linux, Mac OS X, Windows

  • Soạn thảo thông minh
  • Hộ trợ lập trình nhúng
  • Hỗ trợ thêm nhiều ngôn ngữ: C++11, libc++, boost, JavaScript, XML, HTML and CSS
  • Phím tắt giúp tạo nhanh dự án
  • CMake hộ trợ
  • Thống kê

2. Visual Studio

 

Platforms: Windows
IDE này do gã khổng lồ Microsoft sản xuất. Một phần lý do trình soạn thảo này chỉ hoạt động trên Windows. Đây là một trong những trình soạn thảo tốt nhất không chỉ cho C/C++ developers mà còn cho nhiều ngôn ngữ khác. Nếu bạn làm việc team thì có thể bạn cần phiên bản Pro trả phí nhưng nếu bạn làm một mình thì bạn có thể sử dụng bản Express miễn phí.

3. XCode

 

Platforms: Mac OS X
This IDE is the best choice for Mac users. Probably there are so many programmers who prefer to use a Mac. And again this IDE like the previous one (Visual Studio) is not only for C/C++ developers, there are many other popular languages supported. It is completely free to use. So you get pretty cool features to develop your program with C/C++.
Đây là sự lựa chọn tốt nhất cho người dùng Mac. Nó hoàn toàn miễn phí cho bạn nhưng cũng rất nhiều tính năng hay danh cho C/C++ developers

4. Eclipse

 

Platforms: Linux, Mac OS X, Windows
Eclipse hỗ trợ đã nền tảng và nó có một kho mã nguồn mở lớn và miễn phí.
  • Công cụ phát triển C/C++
  • Cộng đồng hỗ trợ Eclipse Git Team
  • Danh sách task Mylyn
  • Khai thác từ xa

Xem thêm

5. NetBeans

 

Platforms: Linux, Mac OS X, Windows
  • Hỗ trợ C++11
  • Bộ công cụ hỗ trợ Qt
  • Phát triển từ xa
  • Tệp điều hướng
  • Cài đắt cấu hình trình biên dịch

Xem thêm

6. Code::Blocks

Platforms: Linux, Mac OS X, Windows

  • Đơn giản, dễ dùng
  • Viết bằng C++.
  • Có thể mớ rộng bằng plugins
  • Open Source! GPLv3 miễn phí
  • Hỗ trợ nhiều trình biên dịch
  • Interfaces GNU GDB
  • Hỗ trợ MS CDB
  • Xem thông kê sử dụng CPU
  • Chuyển đổi giữa các threads

Hướng dẫn học C++

Xem thêm

7. Qt Creator

Platforms: Linux, Mac OS X, Windows
Thư viện nguồn mở là một điểm cộng.
  • Biên dịch nhanh Qt
  • Khởi động Qt nhanh
  • Qt Quick 2D Renderer
  • Qt WebView
  • Qt Bàn phím ảo
IDE có phiên bản pro trả phí.

8. Geany

Platforms: Linux, Mac OS X, Windows
Nhẹ, dễ sử dụng
  • Syntax highlighting
  • Code folding
  • Tự động đóng thẻ XML và HTML
  • Xây dựng hệ thống để biên dịch và thực thi
  • Quản lý project đơn giản

Xem thêm

9. CodeLite

Platforms: Linux, Mac OS X, Windows
  • Hiển thị lỗi dễ hiểu
  • Hỗ trợ Built-in GDB
  • Hỗ trợ C++11 auto keyword, templates, inheritance etc.

Xem thêm

Tóm lại

Yêu cầu công việc khác nhau thì nên lựa chọn những trình soạn thảo khác nhau.

  • Nếu bạn yêu cầu làm những dự án nhỏ hay chỉ mới học lập trình C++ thì có thể lựa chọn những IDE nhẹ, dễ sử dụng như Code::Blocks, Geany
  • Nếu bạn đang làm dự án lớn thì nên chọn những IDE có nhiều công cụ có sẵn như: VLion, Visual Studio

Nên chọn ngôn ngữ lập trình nào?

Bài viết này phù hợp với cả người mới học lập trình lẫn người lập trình thành thạo.

Khi bắt đầu vào con đường phát triển phần mềm, điều quan trọng là bạn nên đầu tư thời gian một cách khôn ngoan trong việc lựa chọn học một công nghệ nào đó mà nó sẽ có cả lợi ích cho bạn trong ngắn hạn với những kết quả nhìn thấy được, cũng như là cho phép bạn thiết lập một nền tảng cho bất kỳ ngôn ngữ lập trình nào trong tương lai. Lựa chọn của bạn sẽ còn phụ thuộc vào một số các yếu tố, vì thế hãy xem qua những đặc thù của chúng, xem nó có dễ học và giúp bạn kiếm sống được hay không. Tôi sẽ cung cấp tới bạn một vài đoạn code hiển thị dòng chữ “hello world”, đó là ứng dụng đầu tiên mà nhiều người tập viết khi học một ngôn ngữ lập trình mới.

Trong bài viết này, chúng ta sẽ xem xét những ngôn ngữ được sử dụng để phát triển phần mềm — là các ứng dụng chạy trên máy tính hoặc các thiết bị di động. Trong bài viết sau, chúng ta sẽ bàn về danh sách các ngôn ngữ lập trình web phổ biến, thường được sử dụng để tạo ra các trang web động và các giao diện tương tác người dùng thông qua trình duyệt.

Nên học ngôn ngữ lập trình nào để phát triển phần mềm?
Nên học ngôn ngữ lập trình nào để phát triển phần mềm?

C/C++

Mặc dù thực ra đó là hai ngôn ngữ riêng biệt, nhưng chúng lại thường được nhóm lại với nhau, C++ về cơ bản là một phiên bản mở rộng của C, bổ sung thêm đặc trưng hướng đối tượng. C++ là ngôn ngữ lập trình được lựa chọn bởi các lập trình viên chuyên nghiệp, hầu hết các game trên máy tính và các phần mềm cho Windows là được viết bằng nó. Nó có tốc độ thực thi rất nhanh, nhưng yêu cầu các lập trình viên phải quản lý bộ nhớ một cách chính xác, do đó để giỏi được ngôn ngữ này là rất khó. Người mới bắt đầu học lập trình thì chưa nên học ngôn ngữ này.

Cơ hội kiếm tiền:

Có ít sự cạnh tranh, các lập trình viên C++ có nhiều yêu cầu tuyển dụng và được trả lương rất cao, đặc biệt là trung lĩnh vực phát triển game.

Ngôn ngữ lập trình C++

Java

Java là một ngôn ngữ lập trình hoàn toàn hướng đối tượng, strongly typed, cùng với một tập đặc trưng mở rộng tập trung vào lập trình mạng và khả năng tương thích trên nhiều nền tảng. Các ứng dụng viết bằng Java thì gần như có thể chạy trên mọi hệ điều hành – mặc dù tốc độ sẽ không tốt được như ứng dụng được thiết kế chạy trên môi trường gốc.

Nó là ngôn ngữ lập trình được lựa chọn cho hầu hết các khóa học về Khoa học Máy tính, và do đó hầu như mọi người đều có ít nhất là một chút kinh nghiệm lập trình Java. Các ứng dụng Android thì cũng được viết bằng Java, tuy vậy bạn không thể đơn giản chạy một ứng dụng Java thông thường trên thiết bị Android hoặc ngược lại.

Cơ hội kiếm tiền:

Bạn có thể tạo ra các ứng dụng có giá trị để bán trên chợ ứng dụng Android; và cũng có rất nhiều công ty lớn tuyển dụng lập trình viên Java, nhưng tỷ lệ cạnh tranh khá lớn và mức lương hơi thấp.

Ngôn ngữ lập trình Java[Chú ý: Đừng nhầm lẫn Java với JavaScript, vì JavaScript là một ngôn ngữ hoàn toàn khác được sử dụng cho lập trình web – chúng ta sẽ nói về nó trong bài viết sau].

C#

Bạn phát âm nó là C sharp, đây là một ngôn ngữ của Microsoft nhân bản từ Java (mặc dù chúng cũng có nhiều điểm khác nhau hoàn toàn) – là một ngôn ngữ hướng đối tượng, đa năng và strongly-type. Tốc độ thực thi khá tốt, mặc dù không nhanh được như C++. Phần mềm viết bằng C# thì yêu cầu phải có .Net Framework và chỉ chạy trên hệ điều hành Windows.

Ngôn ngữ lập trình C#Tiềm năng kiếm tiền:

Có một số lượng khá lớn các công việc yêu cầu C# trong các dự án enterprise, nhưng bạn không có tiềm năng để kiếm tiền trên những dự án nhỏ. Tuy nhiên, nó là một ngôn ngữ thú vị và khá dễ học cho người mới bắt đầu, chắc chắn là tôi sẽ đề xuất nó nếu bạn muốn tập trung phát triển ứng dụng trên hệ điều hành Windows.

Bạn có thể tải bản Visual Studio Express miễn phí của Microsoft, nó là công cụ tuyệt vời để bạn thiết kế giao diện GUI và viết code cho chương trình. Bạn cũng có thể sử dụng IDE này với ngôn ngữ Visual Basic và nhiều ngôn ngữ khác của Microsoft.

Visual Basic

Là một đóng góp khác của Microsoft, Visual Basic là một ngôn ngữ hướng sự kiện tập trung vào các ứng dụng có thiết kế giao diện đồ họa GUI đơn giản. Hướng sự kiện nghĩa là code bạn viết ra thì nói chung sẽ xảy ra theo hành động của người dùng – ví dụ nó xảy ra khi người dùng click chuột vào một cái button chẳng hạn. Ngôn ngữ này rất dễ dàng để học và xây dựng các ứng dụng đơn giản, nhưng nó không phải là ngôn ngữ tốt nhất để học về các khái niệm nền tảng trong lập trình.

Ngôn ngữ lập trình Visual BasicObjective-C/ Cocoa

Đây là một ngôn ngữ dành cho Apple Mac, hầu hết các ứng dụng chạy trên hệ điều hành OSX và iOS đều được viết bằng ngôn ngữ này. Về mặt kỹ thuật, Objective-C là một phiên bản mở rộng của ngôn ngữ C với đặc trưng hướng đối tượng, giống như C++, nhưng nó gần như luôn kết hợp cùng với Cocoa framework để xây dựng các giao diện ứng dụng người dùng và các đặc trưng ở mức độ cao hơn trên nền tảng Mac. Bạn cũng phải cẩn thận trong việc quản lý bộ nhớ khi viết bằng ngôn ngữ này.

Các cú pháp và khái niệm bạn cần học thì tương đối phức tạp khi so sánh với một ngôn ngữ như Java hoặc C#, nhưng mặt khác, Apple cung cấp một môi trường phát triển toàn diện và miễn phí (XCode) và các công cụ khác sẽ làm cho quá trình tạo ra các ứng dụng thực tế và có thể xài được thì khá dễ dàng. Ngoài ra cũng có nhiều bài hướng dẫn và các video trên mạng hướng dẫn cho bạn, vì thế nó cũng chắc chắn là dễ học hơn C++. Khi bạn chọn ngôn ngữ này thì cơ bản là bạn sẽ phát triển ứng dụng cho OSX và iOS, nhưng bạn cũng sẽ có khả năng để viết ứng dụng cho Apple desktop và môi trường di động với chỉ một ngôn ngữ duy nhất.

Ngôn ngữ lập trình Objective-CTiềm năng kiếm tiền:

Chỉ với một tài khoản dành cho developer ($99 đô-la/năm), bạn có thể xây dựng ứng dụng và có cơ hội kiếm khá bộn tiền — Apple đã trả hơn $2 tỉ đô-la cho các nhà phát triển ứng dụng. Các nhà phát triển ứng dụng cho App Store thì có cơ hội tốt hơn các nhà phát triển cho Android để kiếm tiền với các ứng dụng có trả phí, trong khi các nhà phát triển cho Android có khuynh hướng kiếm thu nhập từ việc quảng cáo trên các ứng dụng miễn phí.

Đó là tất cả các ngôn ngữ mà tôi muốn giới thiệu với bạn ngày hôm nay, và chúng là những ngôn ngữ phổ biến để phát triển phần mềm trong thế giới thực trên máy PC, Mac và môi trường di động. Trước khi tôi nhận được những bình luận của bạn, tôi đã quyết định đặt ngôn ngữ Python vào trong danh sách các ngôn ngữ dành cho phát triển web ở bài viết sau, bởi vì có vẻ như nó được sử dụng nhiều nhất ở mảng đó.

Sự thực là một khi bạn đã có kiến thức khá cơ bản trong bất kỳ một ngôn ngữ nào, thì nó rất dễ để học thêm một ngôn ngữ khác; nó cũng giống như là nếu bạn biết tiếng Trung Quốc theo lối tượng hình thì việc học đọc và viết tiếng Nhật Bản cũng dễ hơn rất nhiều — các ngôn ngữ lập trình cũng thường kế thừa và vay mượn lẫn nhau, chúng chia sẻ cùng tập các cú pháp và đặc trưng cơ bản. Trong bài viết tới tôi sẽ giới thiệu các ngôn ngữ chuyên dành cho phát triển web như là JavaScript và PHP.

Bạn đang sử dụng ngôn ngữ nào để lập trình, bạn có tranh luận gì về các ngôn ngữ lập trình hiện nay? Hãy để lại vài dòng bình luận nhé!

Nguồn: dịch từ Makeuseof

Cấu trúc dữ liệu Heap và ứng dụng

Heap là một trong những cấu trúc dữ liệu đặc biệt quan trọng, nó giúp ta có thể giải được nhiều bài toán trong thời gian cho phép. Độ phức tạp thông thường khi làm việc với Heap là O(logN). CTDL Heap được áp dụng nhiều trong các bài toán tìm đường đi ngắn nhất, tìm phần tử max, min… và trong lập trình thi đấu. Vậy Heap là gì? Cài đặt Heap như thế nào?

Heap là gì?

Heap thực chất là một cây cân bằng thỏa mãn các điều kiện sau

  • Một nút có không quá 2 nút con.
  • Với Heap Max thì nút gốc là nút lớn nhất, mọi nút con đều không lớn hơn nút cha của nó. Với Heap Min thì ngược lại.

Mặc dù được mô tả như cây nhưng Heap có thể được biểu diễn bằng mảng. Nút con của nút i là 2*i và 2*i+1. Do Heap là cây cân bằng nên độ cao của 1 nút luôn <= logN.

Ứng dụng chủ yếu của Heap là tìm Min, Max trong 1 tập hợp động (có thể thay đổi, thêm, bớt các phần tử) nhưng như vậy đã là quá đủ.

heap-yeulaptrinh

(Mô hình biểu diễn Heap bằng cây nhị phân và bằng mảng)

Các thao tác với Heap

Ở đây mình hướng dẫn các bạn với Heap Max còn với Heap Min thì tương tự

Khai báo

Ở ví dụ này, Heap sẽ là mảng một chiều kiểu LongInt, nHeap là số phần tử của mảng.

Const
  maxn = 100000;
Var
  nHeap : LongInt;
  Heap : array[0..maxn] of LongInt;

1. UpHeap

Nếu 1 nút lớn hơn nút cha của nó thì di chuyển nó lên trên:
upheap-yeulaptrinh

Procedure UpHeap(i : LongInt);
Begin
  if (i = 1) or (Heap[i] < Heap[i div 2]) then exit; // Nếu i là nút gốc hoặc  nhỏ hơn nút cha thì không làm việc
  swap(Heap[i] , Heap[i div 2]); // Đổi chỗ 2 phần tử trong Heap;
  UpHeap(i div 2); // Tiếp tục di chuyển lên trên
end;

2. DownHeap

downheap-1downheap-2

downheap-3

Procedure DownHeap(i : LongInt);
  Var
    j : LongInt;
  Begin
    j := i*2;
    if j > nHeap then exit; // Nếu i không có nút con thì không làm việc
    if (j < nHeap) and (Heap[j] < Heap[j+1]) then Inc(j); // Nếu i có 2 nút con thì chọn nút ưu tiên hơn
    if Heap[i] < Heap[j] then // Nếu nút cha nhỏ hơn nút con
      begin
        swap(Heap[i] , Heap[j]); // Đổi chỗ 2 phần tử trong Heap
        DownHeap(j); // Tiếp tục di chuyển xuống dưới
      end;
  end;

3. Push

Đưa 1 phần tử mới vào Heap: Thêm 1 nút vào cuối Heap và tiến hành UpHeap từ đây:

Procedure Push(x : LongInt);
  Begin
    Inc(nHeap); // Tăng số phần tử của Heap
    Heap[nHeap] := x; // Thêm x vào Heap
    UpHeap(nHeap);
  End;

4. Pop

Rút ra 1 phần tử ở vị trí v trong Heap: Gán Heap[v] := Heap[nHeap] rồi tiến hành chỉnh lại Heap:

Function Pop(v : LongInt) : LongInt;
  Begin
    Pop := Heap[v]; // Lấy phần tử ở vị trí v ra khỏi Heap
    Heap[v] := Heap[nHeap]; // Đưa phần tử ở cuối Heap vào vị trí v
    Dec(nHeap); // Giảm số phần tử của Heap đi 1
    {Chỉnh lại Heap}
    UpHeap(v);
    DownHeap(v);
  End;

Nguồn: không rõ

Tổng hợp đề thi HSGQG môn Tin học các năm

YeuLapTrinh xin được tổng hợp lại đề thi HSGQG các năm để các bạn tiện tham khảo: