A.牛牛的分配

Solution

签到题,从大到小排序,多出来的统计,少的看能不能补上,不能补的话就跳出

Code

class Solution {
public:
    /**
     * 返回重新分配后,满足牛牛要求的水量的瓶子最多的数量
     * @param n int整型 瓶子的数量
     * @param x int整型 牛牛的对瓶中的水量要求
     * @param a int整型vector 每个瓶子中的含水量
     * @return int整型
     */
    int solve(int n, int x, vector<int>& a) {
        sort(a.begin(), a.end(), greater<int>());
        int now = 0, ans = 0;
        for(int i = 0; i < a.size(); i++) {
            if(a[i] >= x) now += a[i] - x;
            else {
                now -= (x - a[i]);
                if(now < 0) break;
            }
            ans++;
        }
        return ans;
    }
};

B.playfair

Solution

模拟题,写得有点长,数据是随机的,不知道写得有没有锅,跟着题意走就行了,注意j全部换成i

Code

class Solution {
public:
    /**
     * playfair加密算法
     * @param key string字符串 密钥
     * @param str string字符串 明文
     * @return string字符串
     */
char maze[10][10];
string Encode(string key, string str) {
    map<char, int> mp;
    for(int i = 0; i < key.size(); i++) {
        if(key[i] == 'j') key[i] = 'i';
    }
    for(int i = 0; i < str.size(); i++) {
        if(str[i] == 'j') str[i] = 'i';
    }
    int l = 0, r = 0;
    for(int i = 0; i < key.size(); i++) {
        if(!mp[key[i]]) {
            mp[key[i]] = 1;
            maze[l][r++] = key[i];
            if(r == 5) r %= 5, l++;
        }
    }
    for(int i = 'a'; i <= 'z'; i++) {
        if(i == 'j') continue;
        if(!mp[i]) {
            mp[i] = 1;
            maze[l][r++] = char(i);
            if(r == 5) r %= 5, l++;
        }
    }
    string p;
    for(int i = 0; i < str.size(); i += 2) {
        if(i + 1 < str.size()) {
            if(str[i] == str[i + 1]) {
                p += str[i], p += str[i + 1];
                continue;
            }
            for(int j = 0; j < 5; j++) {
                vector<pair<int, int> > v(3);
                int cnt = 0;
                for(int k = 0; k < 5; k++) {
                    if(maze[j][k] == str[i]) {
                        v[1] = make_pair(j, k);
                        cnt++;
                    }
                    if(maze[j][k] == str[i + 1]) {
                        v[2] = make_pair(j, k);
                        cnt++;
                    }
                }
                if(cnt == 2) {
                    p += maze[v[1].first][(v[1].second + 1) % 5];  
                    p += maze[v[2].first][(v[2].second + 1) % 5];
                    goto loop;
                }
            }
            for(int j = 0; j < 5; j++) {
                vector<pair<int, int> > v(3);
                int cnt = 0;
                for(int k = 0; k < 5; k++) {
                    if(maze[k][j] == str[i]) {
                        v[1] = make_pair(k, j);
                        cnt++;
                    }
                    if(maze[k][j] == str[i + 1]) {
                        v[2] = make_pair(k, j);
                        cnt++;
                    }
                }
                if(cnt == 2) {
                    p += maze[(v[1].first + 1) % 5][v[1].second];
                    p += maze[(v[2].first + 1) % 5][v[2].second];
                    goto loop;
                }
            }
            vector<pair<int, int> > v(3);
            for(int j = 0; j < 5; j++) {
                for(int k = 0; k < 5; k++) {
                    if(maze[j][k] == str[i]) {
                        v[1] = make_pair(j, k);
                    }
                    if(maze[j][k] == str[i + 1]) {
                        v[2] = make_pair(j, k);
                    }
                }
            }
            p += maze[v[1].first][v[2].second];
            p += maze[v[2].first][v[1].second];
            goto loop;
        } else {
            p += str[i];
        }
        loop:;
    }

    return p;
}
};

C.牛牛摇骰子

Solution

显然范围小的情况下可以bfs,范围大的话肯定是取11最优,那么至少找到一个合适的范围,大的范围用11去做,小的范围bfs暴力找就能得到答案。这里我找的范围是231(3 * 7 * 11),大于231先处理成231的范围,然后查表。

Code

class Solution {
public:
    /**
     * 把所有询问的答案按询问顺序放入vector里
     * @param arr int整型vector 要查询坐标的数组
     * @return int整型vector
     */
   int dir[10] = {3, -3, 7, -7, 11, -11};
   int table[505];
    map<int, int> vis;
    int bfs(int x, int ed) {
            vis.clear();
            queue<pair<int, int> > q;
            q.push(make_pair(x, 0));
            while(!q.empty()) {
                    int x = q.front().first;
                    int step = q.front().second;
                    q.pop();
                    if(x == ed) {
                        table[ed] = step;
                        return step;
                    }
                    for(int i = 0; i < 6; i++) {
                            int xx = x + dir[i];
                            if(!vis.count(xx)) {
                                    vis[xx] = 1;
                                    q.push(make_pair(xx, step + 1));
                                    //cout << xx << ' ' << step + 1 << ' ' << ed << "\n";
                            }
                    }
            }
            return 0;
    }
    vector<int> MinimumTimes(vector<int>& arr) {
            vector<int> cons;
            for(int i = 1; i <= 250; i++) {
                bfs(0, i);
            }
            for(int i = 0; i < arr.size(); i++) {
                    if(arr[i] <= 231) {
                        cons.push_back(table[arr[i]]);
                        continue;
                    }
                    int num = (arr[i] - 231) / 11;
                    arr[i] -= 11 * num;
                    cons.push_back(table[arr[i]] + num);
            }
            return cons;
    }
};