|
|
|
Ngoài một số quy định đã được nêu trong phần Quy định của Ghi Danh , mọi người tranh thủ bỏ ra 5 phút để đọc thêm một số Quy định sau để khỏi bị treo nick ở MathScope nhé ! * Quy định về việc viết bài trong diễn đàn MathScope * Nếu bạn muốn gia nhập đội ngũ BQT thì vui lòng tham gia tại đây |
| Ðiều Chỉnh | Xếp Bài |
20-04-2011, 10:22 PM | #1 |
+Thành Viên+ | Một bài trong đề thi Tin học trẻ TP Đà Nẵng 2010-2011 Bài 3: (5đ) Số kề trước. Cho một số tự nhiên N có K chữ số (0<K<=255). Bằng cách hoán vị các chữ số của N, ta sẽ được một số tự nhiên H. Yêu cầu: Hãy tìm một số H lớn nhất và nhỏ hơn N từ cách làm trên Input: File văn bản KETRUOC.INP gồm: -dòng thứ 1 ghi số nguyên dương m (m<=10) -m dòng tiếp theo, mỗi dòng ghi một số N. Output: File văn bản KETRUOC.OUT có m dòng, mỗi dòng chứa một số H. Nếu không có số H thì ghi kết quả là -1. Giới hạn: 5 giây. ====================== Ý kiến: Bài này, em dùng thuật toán tham lam, nhưng không thể quét sạch tất cả trường hợp trong 5 giây. Em xin hỏi có ai có thuật toán nào mạnh hơn, giải quyết bài này trong vòng không quá 5 giây không? |
20-04-2011, 10:24 PM | #2 | |
Super Moderator Tham gia ngày: Jul 2010 Đến từ: Hà Nội Bài gởi: 2,895 Thanks: 382 Thanked 2,968 Times in 1,295 Posts | Trích:
| |
22-04-2011, 03:36 PM | #3 |
+Thành Viên+ | |
22-04-2011, 09:27 PM | #4 | |
+Thành Viên+ Tham gia ngày: Dec 2009 Bài gởi: 231 Thanks: 103 Thanked 118 Times in 68 Posts | Trích:
Bài này dò từ hàng đơn vị lên nếu mà 2 số liền kề mà chữ số thứ i-1 lớn hơn chữ số thứ i nghĩa là có cách chuyển để ta thu được 1 số mới nhỏ hơn N. Khi đó ta lấy số lớn nhất trong các số từ i đến length(N) ( số chữ số của N) đổi vị trí với n-1. Rồi sắp xếp các số từ i đến length(N) theo thứ tự giảm dần ta sẽ được số MAX. Ví dụ: 123456784654321 123456768544321 Sẵn tiện cho mình hỏi, có đề THPT không, post lên giúp với !! __________________ | |
23-04-2011, 10:30 PM | #5 |
+Thành Viên+ | Nếu N=4123 thì theo cách làm của anh sẽ cho ra H=? |
23-04-2011, 10:37 PM | #6 |
+Thành Viên+ Tham gia ngày: Dec 2009 Bài gởi: 231 Thanks: 103 Thanked 118 Times in 68 Posts | 4123 --> 3421 __________________ |
24-04-2011, 09:47 AM | #7 |
+Thành Viên+ Tham gia ngày: Jan 2010 Bài gởi: 2 Thanks: 0 Thanked 0 Times in 0 Posts | Ơ hay!! 123456784654321 nếu chuyển thành 123456784654312 thì đúng hơn chứ nhỉ vì 123456768544321 < 123456784654312 < 123456784654321 mà. Mình vẫn chưa làm ra, nhưng theo mình thì bài này làm bằng Quy Hoạch Động. |
24-04-2011, 10:24 AM | #8 |
+Thành Viên+ | |
24-04-2011, 07:14 PM | #9 |
+Thành Viên+ Tham gia ngày: Jan 2010 Bài gởi: 2 Thanks: 0 Thanked 0 Times in 0 Posts | À không, cách của duynhan đúng rồi đấy, chỉ là cái ví dụ làm sai thôi, tức là theo thuật toán đó thì đúng là sẽ đổi chỗ 2 chữ số cuối cùng thôi. Hồi sáng chưa đọc kỹ mà chỉ nhìn ví dụ, sr nha |
25-04-2011, 10:14 AM | #10 |
+Thành Viên+ Tham gia ngày: Apr 2011 Bài gởi: 6 Thanks: 12 Thanked 1 Time in 1 Post | ví dụ Em có ví dụ này. 37546129 thì theo thuật toán của anh duynhan thì sẽ là 37549621 cho mình hỏi luôn, anh perfectstrong đạt giải mấy. |
26-04-2011, 08:39 AM | #11 | |
+Thành Viên+ Tham gia ngày: Dec 2009 Bài gởi: 231 Thanks: 103 Thanked 118 Times in 68 Posts | Trích:
@all: Sr cái ví dụ mình cho nhầm ^^ __________________ | |
26-04-2011, 10:41 AM | #12 |
+Thành Viên+ Tham gia ngày: Mar 2008 Bài gởi: 89 Thanks: 19 Thanked 70 Times in 28 Posts | Code: #include <cstdio> #include <cstring> using namespace std; int m,num[10],result[255]; char N[255]; int main(){ freopen("KETRUOC.INP","r",stdin); freopen("KETRUOC.OUT","w",stdout); scanf("%d",&m); while (m--){ scanf("%s",&N); int length=strlen(N); for (int i=0; i<length; i++) num[N[i]-'0']++; for (int i=0; i<length; i++){ if (i==length-1) for (int j=0; j<10; j++) if (num[j]){ result[i]=j; num[j]--; } bool ok=false; for (int j=0; j<N[i+1]-'0'; j++) if (num[j]){ ok=true; break; } if (ok){ result[i]=N[i]-'0'; num[N[i]-'0']--; } else{ for (int j=N[i]-'0'-1; j>-1; j--) if (num[j]){ result[i]=j; num[j]--; break; } int t=i+1; for (int j=9; j>-1; j--) while (num[j]){ result[t++]=j; num[j]--; } break; } } int k=0; while (!result[k]) k++; for (int i=k; i<length; i++) printf("%d",result[i]); printf("\n"); } return 0; } thay đổi nội dung bởi: Mashimaru, 26-04-2011 lúc 10:44 AM |
The Following User Says Thank You to Mashimaru For This Useful Post: | perfectstrong (27-04-2011) |
27-04-2011, 01:31 PM | #13 |
+Thành Viên+ Tham gia ngày: Apr 2011 Bài gởi: 6 Thanks: 12 Thanked 1 Time in 1 Post | nhưng ở trên anh viết là dò từ hàng đơn vị lên nếu mà 2 số liền kề mà chữ số thứ i-1 lớn hơn chữ số thứ i nghĩa là có cách chuyển để ta thu được 1 số mới nhỏ hơn N. Khi đó ta lấy số lớn nhất trong các số từ i đến length(N) ( số chữ số của N) đổi vị trí với i-1. Rồi sắp xếp các số từ i đến length(N) theo thứ tự giảm dần ta sẽ được số MAX mà |
27-04-2011, 08:15 PM | #14 | |
+Thành Viên+ | Trích:
| |
28-04-2011, 04:56 AM | #15 | |
+Thành Viên+ Tham gia ngày: Dec 2009 Bài gởi: 231 Thanks: 103 Thanked 118 Times in 68 Posts | Trích:
Đây là code: Code: Var S:string; i, j, cs, k:integer; max, t:char; Begin Readln(S); i:=length(S); While (i>1) and (s[i-1]<=s[i]) do dec(i); //Tim s[i-1]>s[i] If i=1 then Begin Write('Khong co cach doi'); Exit; End; dec(i); max:='0'; For j:=i+1 to length(S) do If (s[j]<s[i]) and (max<s[j]) then Begin max:=s[j]; cs:=j; End; t:=s[i]; s[i]:=s[cs]; s[cs]:=t; k:=i+1; For i:=k to length(S)-1 do For j:=i+1 to length(S) do IF s[i]<s[j] then Begin t:=s[i]; s[i]:=s[j]; s[j]:=t; End; Write(S); End. __________________ | |
The Following User Says Thank You to duynhan For This Useful Post: | perfectstrong (28-04-2011) |
Bookmarks |
|
|