Trang chủ SPOJ: http://www.spoj.com/
Trang SPOJ trường mình: http://www.spoj.com/PTIT/
Để sub được bài trên SPOJ thì cần đăng ký nick: http://www.spoj.com/register/ và đăng nhập vào account đã nhé.
Ok, giờ bắt đầu sub các bài basic của trường mình nhé: http://www.spoj.com/PTIT/problems/basic/ những bài này thì thuật toán cũng khá dễ học :D
Trước hết sub bài Hello PTIT nhé: http://www.spoj.com/PTIT/problems/HELLOPOJ/
Bài này chỉ cần in ra dòng chữ "Hello PTIT OJ." là được :D
Bấm nộp bài
Ở trang này:
- Chọn ngôn ngữ là Java (Java SE 8u51)
- Paste code của bạn vào ô mã nguồn hoặc bấm chọn tệp để chọn file code của bạn. Lưu ý: Sub code ở đây cũng như ở trang http://ideone.com/. Bạn không được để
packagepublicnếu không nộp sẽ bị lỗi! (chỉ riêng tên class là Main thì mới được để public thôi) - Bấm nộp bài
Nếu có kết quả xanh là bạn đã code đúng yêu cầu đề bài rồi :D chúc mừng nhé!
Còn nếu sub cam thì có thể rơi vào những trường hợp sau đây:
- Biên dịch gặp lỗi: Bạn chọn ngôn ngữ sai hoặc do thiếu thư viện
- SIGSEGV: Khai báo bị tràn mảng. Không được khai báo mảng quá lớn
int []a = new int [100000000];
int [][]b = new int[10000][10000];
- NZEC: Thường là truy cập đến chỉ số mảng sai (OutOfBoundsException, mảng của bạn khai báo chỉ có 3 phần tử mà bạn lại truy cập đến chỉ số thứ 4,5 chẳng hạn) hoặc do chia 0, input sai (khi nhập xâu bị rỗng chẳng hạn)...
- Chạy quá thời gian: Bạn lưu ý thường thì mỗi bài có yêu cầu về thời gian chạy, thường là 1 giây (tương ứng với việc bạn có thể chạy 1 vòng for từ 1 đến 100 triệu thì vẫn được chấp nhận, nhưng đến 1 tỷ thì sẽ bị out)
- Làm sai: Lỗi này khi bạn có ouput cho một test nào đó khác với yêu cầu
Một vài lưu ý khác:
- Vào ra đều dạng chuẩn, tức là bằng màn hình, tức là dùng luồng System.in và System.out.
Bạn có thể tăng tốc vào ra bằng cách thay Scanner và System.out bằng các luồng khác như BufferedReader và BufferedWriter chẳng hạn (Ví dụ như bài này http://www.spoj.com/problems/TSORT/ không thể nào nhập vào bằng Scanner được, quá time ngay!) Đây là code bài này của mình
- Hãy nhập input và hiển thị output đúng như yêu cầu của đề bài, tức là bạn hãy đọc kỹ đề bài và xem dạng input và output mẫu. Chỉ cần thừa dấu chấm dấu xuống dòng đều có thể nhận "Kết quả sai" đấy!
- Bạn chỉ được nộp duy nhất 1 file (tức duy nhất 1 class) nên nếu bạn cần tạo 1 class nào khác, hãy để nó là inner static class (để có thể dùng trong hàm main) thì nộp mới được chấp nhận.
Ví dụ:
- Lưu ý miền giá trị của input: Ví dụ trong bài xử lý số, nếu đề bài cho số <=10^9 thì các bạn có thể dùng int, còn <=10^18 thì hãy dùng long, còn lớn hơn nữa, thì nên nhập như String rồi xử lý bằng BigInteger xem sao (nếu được cho phép :v). Và cũng có thể trong quá trình tính toán của bạn, số sẽ tràn kiểu, ví dụ số int (max) nhân số int (max) sẽ ra số long chẳng hạn
- Lưu ý thời gian yêu cầu: Như mình đã nói ở trên, 1 giây ứng với chạy 1 vòng for từ 1 đến 100 triệu, cho nên để không bị quá time, bạn nên tính xem code của mình chạy trong bao lâu, và nếu không thích hợp phải đổi phương án khác. Ví dụ như bài sinh xâu nhị phân độ dài n thì nếu dùng thuật toán sinh sẽ mất 2^n thao tác lặp, vậy nên nếu n=100 chẳng hạn thì không thể chạy trong vòng 1 giây được.