Chuyên mục: Code online

Giải P152PROF – ROUND 2F – Min max

Đề bài :

http://www.spoj.com/PTIT/problems/P152PROF/

Ý tường :

  • Với việc tìm số nhỏ nhất : đi từ cuối về đầu và gán với số lớn nhất có thể, sau khi gán nếu tại vị trí đầu có giá trị = 0 thì phải cho nó về 1 và bù vào cái số nào gần nhất nó
  • Với việc tím số lớn nhất : đi từ đầu tới cuối, cố gắng điền số lớn nhất có thể , có thể tất cả đằng sau là 0 cho nên khi a[i] = 0 thì có thể thoát vòng lặp luôn

Code C++ :

https://www.dropbox.com/s/aepx48s89a4hex9/P152PROF.cpp?dl=0

 

Giải bài P154PROI – ROUND 4I – Xâu cân bằng

Ý tường phân tích :

Bản chất ngôn ngữ C/C++ khi lưu dữ liệu char đã là lưu mã ascii

vậy nên ta không quan tâm nhiều đến vấn đề mà

ta cứ dùng mảng char và trừ đúng như công thức trong đề bài

chỉ có 1 chú ý là : k nên tốn time cho việc xây dựng chuỗi R
vì chuỗi R là đảo ngược chuỗi S nên hãy xử lý ngay ở chuỗi S
sẽ tiết kiệm dc time chạy

Code :

https://www.dropbox.com/s/d01xdzawspu0egd/P154PROI.cpp?dl=0

Giải bài P166SUMI – ROUND 6I – Rick Flag

Ý tưởng : Bài này đơn giản chỉ cần duyệt toàn bộ và đếm số lần xuất hiện của số 0

có 1 điều lưu ý là khi biến đếm được tăng lên thì kiểm tra luôn xem nó đã lớn hơn 1 chưa

nếu lớn hơn thì thoát khỏi hàm luôn, như vậy sẽ giảm dc time chạy trong trường hợp có nh số 0

Code :

#include<stdio.h>
int n;
int x[1000];
bool kiemTra(){
int dem = 0;
for (int i = 0 ; i<n; i++){
if (x[i] == 0) {
dem++;
if (dem > 1) return false;
}
}
if (dem == 0 ) return false;
else return true;
}
main(){

scanf(“%d”,&n);
for (int i = 0 ; i < n ; i++){
scanf(“%d”,&x[i]);
}

if (kiemTra()){
printf(“YES”);
}else{
printf(“NO”);
}
}

Phân tích và giải bài 1 – P153PROG

Ở bài này điều chú ý đầu tiên là kiểu dữ liệu đã cho là <= 10^12 vậy nên mình chọn long long luôn cho chắc cú :V
Tiếp theo, đề bài cho 2 bộ test rồi
thử xem sao
Bộ test 1:
n = 10, k = 3
n = 10 =>
dãy là : 1 3 5 7 9 2 4 6 8 10
index : 1 2 3 4 5 6 7 8 9 10
-> quy luật : nếu n là số chẵn thì
+ khi k <= n/2 -> giá trị = 2 * index – 1
+ khi k > n/2 -> giá trị = 2*(index – n/2)
Bộ test 2 :
n = 7, k = 7
dãy là : 1 3 5 7 2 4 6
index : 1 2 3 4 5 6 7
-> quy luật : nếu n là số lẻ thì
+ khi k <= n/2 -> giá trị = 2 * index – 1
+ khi k == n/2 +1 (giữa) -> giá trị = max = n
+ còn lại : giá trị = 2 * (index – n/2 – 1)
Theo đúng như thế, chuyển thành code