Hướng dẫn giải của Bedao Mini Contest 07 - RATE


Chỉ dùng lời giải này khi không có ý tưởng, và đừng copy-paste code từ lời giải này. Hãy tôn trọng người ra đề và người viết lời giải.
Nộp một lời giải chính thức trước khi tự giải là một hành động có thể bị ban.

Tác giả: bedao

Nhận xét:

  • Khi quy đổi các kí tự ~a~ đến ~z~ dưới dạng bảng mã ~ASCII~ ta sẽ được các số từ ~97~ đến ~122~, khi chuyển các số này ( hệ thập phân ) sang hệ nhị phân thì số lượng số bit có nghĩa là ~7~.
  • Số hàng là số lần xuống dòng cộng thêm cho ~1~, tức số lần xuất hiện của ~\#~ trong xâu cộng thêm cho ~1~.

Thuật toán:

  • Ta đếm số kí tự chữ cái từ kí tự chữ cái đầu tiên đến kí tự ~\#~ đầu tiên, tiếp tục đếm số kí tự chữ cái liền ngay sau ~\#~ đầu tiên đến kí tự ~\#~ thứ hai,... và quá trình này chỉ kết thúc khi đếm được những kí tự chữ cái liền sau kí tự ~\#~ cuối cùng. Khi đó, số cột chính là số kí tự chữ cái nhỏ nhất của quá trình trên, khi thực hiện quá trình ta hoàn toàn có thể lưu các chuỗi kí tự này vào một vector kiểu string: vector<string>
  • Xem các phần tử là xâu trong vector này là một hàng, lúc này ta có được một ma trận. Sau đó, ta sẽ tiến hành đếm số kí tự ~0~ và ~1~ trong ma trận này.

Code mẫu

#include <bits/stdc++.h>

using namespace std;

#define fastIO ios::sync_with_stdio(false); cin.tie(0);
const int INF = 1E9;

string toBin(int num)
{
    string res = "";
    while (num > 0)
    {
        res += (char)((num % 2)+'0');
        num /= 2;
    }
return res;
}

int main()
{
    fastIO

    int l;
    cin>>l;
    string s;
    cin>>s;

    vector<string> mat;
    int n = 1;
    int m = INF;
    int len = 0;
    string A = "";
    for (int i = 0;i < (int)s.size(); ++i)
    {
        int num = (int)s[i];
        if (s[i] == '#')
        {
            ++n;
            m = min(m, len);
            mat.push_back(A);
            A.clear();
            len = 0;
            continue;
        }
        string T = toBin(num);
        len += (int)T.size();
        A += T;
    }
    m = min(m, len);
    mat.push_back(A);

    int cnt0 = 0, cnt1 = 0;
    for (int i = 1;i <= n; ++i)
        for (int j = 0;j < m; ++j)
            if (mat[i-1][j] == '1') ++cnt1;
            else ++cnt0;

    cout<<n<<" "<<m<<"\n";
    cout<<fixed<<setprecision(9)<<1.0*cnt1/cnt0;
}

Bình luận

Hãy đọc nội quy trước khi bình luận.


Không có bình luận tại thời điểm này.