Editorial for Bedao Mini Contest 07 - RATE


Remember to use this editorial only when stuck, and not to copy-paste code from it. Please be respectful to the problem author and editorialist.
Submitting an official solution before solving the problem yourself is a bannable offence.

Author: 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;
}

Comments

Please read the guidelines before commenting.


There are no comments at the moment.