thảo luận [Học Tập] Topic thuật toán

  • Người tạo chủ đề Người tạo chủ đề unknowpc90
  • Ngày bắt đầu Ngày bắt đầu
Mấy thím cho mình hỏi câu ko liên quan với, đơn giản thôi vì mình còn gà mờ mới tập code. Trong C ý ví dụ như sau khi mình code 1 đoạn dài xong nhưng lúc sau mình lại muốn đặt nó vào if else thì phải làm sao để nó tự thụt vào 3-4 khoảng cách vậy mấy thím chứ đi space từng dòng oải quá
5ubGaWm.png
vào setting tìm cái nào liên quan tới autoindent rồi xài.
 

C-like:
func numTeams(rating []int) int {
    total := len(rating)
    if total < 3 {
        return 0
    }
    
    teams := 0
    for i, rate := range rating {
        // travel left and right
        for l := 0; l < i; l++ {
            for r := i + 1; r < total; r ++ {
                // check cond 1
                if rating[l] < rate && rate < rating[r] {
                    teams ++
                }
                // check cond 2
                if rating[l] > rate && rate > rating[r] {
                    teams ++
                }
            }
        }
    }
    
    return teams
}
 
Mấy thím cho mình hỏi câu ko liên quan với, đơn giản thôi vì mình còn gà mờ mới tập code. Trong C ý ví dụ như sau khi mình code 1 đoạn dài xong nhưng lúc sau mình lại muốn đặt nó vào if else thì phải làm sao để nó tự thụt vào 3-4 khoảng cách vậy mấy thím chứ đi space từng dòng oải quá
5ubGaWm.png
không biết bạn xài editor nào, mình thì cứ bôi đen cả cụm xong nhấn tab vài cái là xong.
mà nếu trong if có đoạn dài thì nên tách ra làm function riêng chứ để nguyên vậy về sau đọc lại muốn đập bàn phím lắm... :burn_joss_stick:
 
JavaScript:
//Chạy bằng hàm này
function countSolution(){
    var arr = //dãy số bạn nhập vào;
    var target = //đơn giản là target;
    var sum = 0;
    arr.forEach(i=> sum +=i);
    if((sum - target) % 2 != 0){
        return 0;
    }
    target = (sum - target) / 2;
    var groups = groupNumber(arr);
    var resolutionCount = 0;
    arrResInitial = [];
    res = evaluate(groups, groups.length - 1, target, arrResInitial, resolutionCount);
    return res;
}

//hàm biến chuỗi ban đầu thành 1 dạng chuỗi thống kê
function groupNumber(arr){
    var groups = {};
    for (var i of arr){
        if(groups[i]){
            groups[i] ++;
        }else{
            groups[i] = 1;
        }
    }
    var res = []
    for(var i in groups){
        res.push({num: parseInt(i), count: groups[i]});
    }
    return res;
}

//hàm xác định xem phương án có khả thi hay không
function evaluate(groups, index, target, arrResInitial, resolutionCount){
    var num = groups[index].num;
    var max =  Math.floor(target/num);
    var count = groups[index].count < max ? groups[index].count : max;
    for(var i = 0; i<=count; i++){
        actionCount++
        var arrRes = JSON.parse(JSON.stringify(arrResInitial));
        multiRes = i*num;
        arrRes.push({num:num, multiplier: i, pop: groups[index].count});
        if(multiRes == target){
            resolutionCount += multiplyPosibilities(arrRes);
        }else if(multiRes < target){
            if(index > 0){
                resolutionCount += evaluate(groups, index - 1, target - num*i, arrRes, resolutionCount);
            }
        }
    }
    return resolutionCount;
}

//hàm nhân mấy cái tổ hợp
function multiplyPosibilities(arrRes){
    var res = 1;
    for(var item of arrRes){
        res = res * quickMath(item.pop, item.multiplier);
    }
    return res;
}

//hàm tính số lượng các tổ hợp. Naming luôn là 1 vấn đề đau đầu
function quickMath(pop, picked){
    var small = picked > (pop - picked) ? picked : (pop - picked);
    if(small == pop){
        return 1;
    }
    var leftOver = pop - small;
    var res = 1;
    for(var i = small + 1; i <= pop; i++){
        res *= i;
    }
    for(var i = 1; i <= leftOver; i++){
        res = res / i;
    }
    return res;
}


bạn tự đọc code mà hiểu. Đừng có làm cái trò tính hết các case. Dãy 10 số thì nó có 1 nghìn case. Dãy 20 số nó là 1 triệu case.
 
day10 adventofcode năm nay có dùng quy hoạch động kìa, filter dc khối người :)
 
Bài 1 thì độc phức tạp là logx(bound) thôi.
  • tính lx = logx(bound)
  • for i=0 tới i<=lx: tính ly = logy(bound - x^i)
  • tổng kết quả ly ở bước trên chính là kết quả bài toán
 
Em cũng mới đang học ạ, các bác có thể cho em hỏi bài này nên dùng giải thuật nào không ạ?
 

Tệp đính kèm

  • Screenshot_20201211-012002.png
    Screenshot_20201211-012002.png
    160,6 KB · Lượt xem: 180
Em cũng mới đang học ạ, các bác có thể cho em hỏi bài này nên dùng giải thuật nào không ạ?

Tương tự bài coin exchange problem: đưa 1 amount N và vô hạn các coins lẻ 2,3,4, tính tổng số cách đổi N dùng 2,3,4. Có 1 bài liên quan nữa là leo cầu thang N bậc, mỗi lần cho phép bước 1 hoặc 2 bước, tính tổng số cách. Bài của bạn giống bài leo cầu thang hơn vì phải để ý thứ tự: (2,3) khác (3,2). coin change thì (2,3) giống (3,2)
Lời giải ... google: coin change, climbing stairs
 
Sửa lần cuối:
Tương tự bài coin exchange problem: đưa 1 amount N và vô hạn các coins lẻ 2,3,4, tính tổng số cách đổi N dùng 2,3,4. Có 1 bài liên quan nữa là leo cầu thang N bậc, mỗi lần cho phép bước 1 hoặc 2 bước, tính tổng số cách. Bài của bạn giống bài leo cầu thang hơn vì phải để ý thứ tự: (2,3) khác (3,2). coin change thì (2,3) giống (3,2)
Lời giải ... google: coin change, climbing stairs
Em cảm ơn bác, mà với các trường hợp N cao thì mình có cách gì để check output là đúng k ạ?
ung.png
 
adventofcode hôm nay lại là game of life.
nói chung năm nay đề dễ cơ mà khá thú vị, cảm giác như trở lại thời kỳ đầu mới học algo :">
 
mình có cách gì để check output là đúng k?
Hoặc là mình có sẵn output đúng để đối chiếu (kiểu như test); và hoặc là mình đảm bảo chương trình đúng (correctness) do đó output sinh ra là đúng./
Cách hay dùng để chứng minh thuật toán đúng là loop invariant. Trong quyển Intro to Algorithms chap 2 có ví dụ. /
Bài của thím thì code theo công thức đệ quy là đúng thôi (công thức giống như Fibonacci numbers).
Từ công thức đệ quy đó cũng ra được số cách chỉ phụ thuộc N, giống như Fibonacci. Nhưng tính kiểu này phải giải quyết sai số khi N lớn, cái này mình chịu.
 
dạ em có thử rồi mà với các test với n khoảng 60 đổ lên bị sai bác ạ Xem tệp đính kèm 325705
đúng rồi vì 60 là nó tràn limit integer rồi =)
cái này cơ bản vãi :confused:

edit: tôi vừa test thử thì F[60] khoảng trên 2 tỉ, sắp chạm giới hạn uint32 rồi chả lỗi. mấy bài dạng này đều cần để ý số lớn.
 
Sửa lần cuối:
đúng rồi vì 60 là nó tràn limit integer rồi =)
cái này cơ bản vãi :confused:

edit: tôi vừa test thử thì F[60] khoảng trên 2 tỉ, sắp chạm giới hạn uint32 rồi chả lỗi. mấy bài dạng này đều cần để ý số lớn.
Bác rảnh tay xem giúp em bài này luôn
adore.png
em có nên sắp xếp dãy từ nhỏ đến lớn rồi vừa lặp vừa check điều kiện không ạ?
unknown.png
 

Thống kê chủ đề

Ngày tạo
unknowpc90,
Người trả lời cuối
Spaghetti Code,
Trả lời
1.460
Lượt xem
154.143
Quay lại
Lên đầu trang