=)) tự nhiên mình thấy mắc cười quá , hình như trường hắn có mình hắn học IT thôi hay sao ấy =))
Announcement
Collapse
No announcement yet.
[Thuật toán] THÁCH THỨC TOÀN THỂ SINH VIÊN UIT
Collapse
X
-
-
Chậc, mới đầu đọc cái này em cứ nghĩ là gà nhà khích tướng các bạn để phát hiện nhân tài hay khích lệ các bạn học thuật toán thôi, mà xem tình hình tới giờ thì có vẻ không phải vậy. Mà nếu là không phải như em nghĩ thì bạn kia sử dụng tiếng Việt hơi tệ ^^
Comment
-
Originally posted by 07520004 View PostỜ, vẫn còn vào được, chắc tại mạng mẽo nó chập chờn:happy:SỐNG TRONG MÁI NHÀ UIT, BẠN HÃY NHỚ :happy:
1. Chấp hành pháp luật, tuân thủ nội quy; 2. Tích cực học tập, chủ động nghiên cứu
3. Đi học đúng giờ, trang phục lịch sự; 4. Nhớ xếp hàng và đừng chen lấn
5. Sống có trách nhiệm và biết sẻ chia; 6. Giữ gìn tài sản chung như tài sản của chính bạn
7. Sử dụng tài sản, thời gian hiệu quả; 8. Khiêm tốn, lễ phép, hòa nhã, thân thiện
9. Không xả rác để không nhặt rác; 10. Văn minh, lịch sự dù trên lớp học, diễn đàn hay mạng xã hội
Comment
-
Originally posted by anonymous1 View PostBạn đã sử dụng thuật toán tham lam và đệ quy nhưng :
a. Thuật toán tham lam trong trường hợp này là không chính xác.
b. Dùng đệ quy trong bài này sẽ bị quá thời gian cho phép.
Xem ra các bạn vẫn chưa đủ "trình độ" để accept bài này, các bạn code xong thì gửi lên VOJ, nếu accept thì xem như đã làm xong.Last edited by 11520673; 26-10-2011, 21:16.
Comment
-
Làm bài xong....tình hình là mấy bữa nay đã ức chế vì ế hành rồi.....need someone or something to cool me down....
Bạn Tú làm bài không sai....không ai dám nói vét cạn sai vì nó luôn đúng. Cái điểm yếu duy nhất của vét cạn là nó quá lâu.
Còn lâu bao lâu huh ? Để mình nói cho bạn biết: bạn cài dởm nhât thì n^n, tốt hơn thì n! và tốt nhất là 2^n
Giả sử bạn code cứng chút thì T = n!, 32! = 2.6313083693369353016721801216e+35, với 1 máy vi tính hiện đại cho rằng xử lý được 1 tỷ phép tính trên giây (thật ra mình chạy vòng for (i = 0 to 1 tỷ) ko bao giờ kịp trong 1s cả. thì bạn sẽ tốn 263130836933693530167218012.16s tương đương 8343824103681301692.26 năm.
Nếu bạn code vét tốt nhất trên lý thuyết là là T = n * 2^n (vét không đệ quy) thì 2^32 * 32 = 128 tỷ, nếu trên máy mình giả sử thì chạy trong 42s, nhưng thực tế thì phải mất hơn 2', bài này mình đã gặp đề cho n = 40, 40*2^40 = 4398046511104, tức là khoảng nửa ngày bạn mới chạy xong 1 test.
Cho các bạn khác: cách làm như sau:
bài này không tránh khỏi việc vét, nhưng mình vét khôn ngoan hơn tí: chia ra 2 tập (bất kỳ) gọi là a và b
vét cả 2 set và lưu tất cả các tổng vào trong 2 mảng set1 và set2. Thời gian vét chỉ tốn O((n/2) * 2^(n/2))
sort lại set2 tốn O(2^(n/2) log (2^(n/2)) = O((n/2) * 2^(n/2))
với mỗi phần tử ở set1, tìm phần tử ở set2 sao cho : tổng của chúng chênh lệch ít nhất có thể , vì set2 đã được sort nên mình chọn tìm kiếm nhị phân. Đô phức tạp: O(2^(n/2) * log(2^(n/2))
Với mỗi lần tìm như thế, mình so sánh với min của mình, nếu bằng thì mình tăng số cách lên 1, nếu bé hơn thì mình sẽ cho min = kết quả hiện thời, reset số cách = 1 tốn O(1)
Cuối cùng: độ phức tạp bài này là O(2^(n/2) * (n/2) + 2^(n/2) * (n/2) + (n/2) * 2^(n/2) * O(1)) = O((n /2) * 2^(n/2))
Với n = 32, bài này tốn hơn 16 * 2^16 = 1 048 576 bước tính < 100 000 000 => an toàn để nộp
Mà buồn thiệt....hình như cả UIT có mỗi mình làm thôi, pro thì đi Thái hết rồi, còn lại toàn cầm gạch ném :|....kiểu này K5 K6 cố lên chứ K4 cũng già rồi sắp ra trường hết rồi
Code : http://pastebin.com/PcrVKsfW
Code:#include <iostream> #include <algorithm> using namespace std; long long int set1[70000],set2[70000]; long long int a[40],b[40],n,na,nb,ns1,ns2,mini,nummini,Tsum,nset; long long int getsum(long long int *a,long long int id) { long long int res = 0,i; for (i = 0;id != 0;++i,id >>= 1) if (id & 1) res += a[i]; return res; } void solution() { long long int dif,val,finder,i,j,lowb,uppb; ns1 = (1 << na); for (i = 0;i < ns1;++i) set1[i] = getsum(a,i); ns2 = (1 << nb); for (i = 0;i < ns2;++i) set2[i] = getsum(b,i); sort(set2,set2 + ns2); mini = -1; for (i = 0;i < ns1;++i) { if (mini != -1) lowb = (Tsum - mini) / 2 - set1[i]; else lowb = 0; uppb = Tsum / 2 + 1 - set1[i]; lowb = lower_bound(set2, set2 + ns2, lowb) - set2; uppb = upper_bound(set2, set2 + ns2, uppb) - set2; for (j = max(lowb - 1,0LL);j < uppb;++j) { val = set1[i] + set2[j]; dif = abs(Tsum - val - val); if ((dif == mini) && (nset == val)) ++nummini; else if ((dif < mini) || (mini == -1)) { nset = val; mini = dif; nummini = 1; } } } if (mini == 0) nummini = nummini / 2; } int main() { int i; cin >> n; na = n/2; nb = n - na; Tsum = 0; for (i = 0;i < na;++i) {cin >> a[i];Tsum += a[i];} for (i = 0;i < nb;++i) {cin >> b[i];Tsum += b[i];} solution(); cout << mini << ' ' << nummini << endl; return 0; }
5905341 2011-10-26 01:41:53 Annonymous Đạt yêu cầu 2.20 5.6M C++ 4.0.0-8
5908569 2011-10-26 14:05:18 Chau Nguyen Đạt yêu cầu 1.36 3.7M C++ 4.3.2
Ai nhanh hơn, Ai nhanh hơn, Ai thắng cuộc hôm nay ^_^....hơn cả 1 giây đấy bác
Pro đi Thailand dự ACM/ICPC khu vực hết rồi bạn ơi, mình mới gà thôi, bạn thông cảm ^_^ Mà bạn nói mình làm xong rồi nói chuyện, vậy bạn muốn nói cái chi chi ?
@Mr Quốc:Em cũng tu cả tháng rồi kỳ sau tới lượt anh nhé. Giờ em lên núi tu tiếp.
Góc chí phèo:
[Thuật toán] THÁCH THỨC TOÀN THỂ SINH VIÊN UIT
Update 100% completed....windows is shutting down
It's now safe to "ném đá" your computer
Last edited by 09520019; 26-10-2011, 22:31.Khoảng cách giữa bạn và ước mơ của bạn là bao xa ?
Comment
-
Chúc mừng các bạn, vậy là cuối cùng đã có người giải được, mình cũng chỉ là kẻ vô danh tiểu tốt, sau này khi mình mạnh hơn sẽ thách đấu tiếp, hy vọng đến lúc đó vẫn có người giải được. Thank tất cả những bạn tích cực đóng góp cho topic này. Xin phép được close topic tại đây, mọi gạch đá về sau mình don't care.
Comment
-
thật ra thì bạn dùng từ khiêm tốn hơn chút có lẽ đã có đáp án từ lâu rồi hi vọng lần thách đấu sau bạn dùng từ ngữ khiêm tốn hơnBe different and always different
http://archlinuxvn.org/
http://theslinux.org
http://lab.infosec.xyz
Comment
Comment