A - A Healthy Breakfast

题意

给你一个包含三个字母("S", "M", "R")的字符串,判断"R"是否在"M"前面。

思路

逐个判断,看"R"和"M"哪个先出现就好了。

题解

核心代码如下

int main(){
    char c;
    while(true){
        cin >> c;
        if(c == 'R') {
            cout << "Yes" << endl;
            return 0;
        } else if(c == 'M'){
            cout << "No" << endl;
            return 0;
        }
    }
}

B - Vertical Reading

题意

将一个字符串S以每行w个字符分成若干行(最后一行可以不足w个字符),问是否有一列与T相同。

思路

枚举w,c的值,注意取到的字符长度和T一致。

题解

核心代码如下

int main(){
    string s, t;
    cin >> s >> t;
    for(int w = 1;w < s.length(); w++) {
        for(int c = 0; c < w; c++){
            bool flag = true;
            // 如果满足下面的条件,说明取到的字符串长度会比T多1,这样的c不符合条件,需要跳过。
            if(t.length() * w + c < s.length()) continue;;
            for(int i = 0; i < t.length(); i++){
                if(s[i * w + c] != t[i]) {
                    flag = false;
                    break;
                }
            }
            if(flag) goto success;
        }
    }
    fail:
    cout << "No" << endl;
    return 0;
    success:
    cout << "Yes" << endl;
    return 0;
}

C - Move It

题意

n件物品分布在n个箱子里,移动物品使得每个箱子里只有一件物品。求最小代价。

思路

由于最后箱子和物品是一一匹配的,而且将物品移出箱子的代价是固定的(除最大代价物品的代价和),所以保留每个箱子中代价最大的物品,然后将其他物品移出去就可以了。

题解

int main(){
    int n; cin >> n;
    vector<int> A(n), W(n);
    for(int i = 0; i < n; i++) cin >> A[i];
    for(int i = 0; i < n; i++) cin >> W[i];
    map<int, vector<int>> m;
    // m 记录每个箱子里的物品代价
    for(int i = 0; i < n; i++){
        m[A[i]].push_back(W[i]);
    }
    int result = 0;
    for(auto i : m){
        result += accumulate(i.second.begin(), i.second.end(), 0);
        result -= *max_element(i.second.begin(), i.second.end());
    }
    cout << result << endl;
}

D - Ghost Ants

题意

一个数轴上有若干蚂蚁,他们可能朝左或者右,速度为1个单位长度每单位时间,问T时间后互相穿过对方的蚂蚁有多少对(T时刻重叠的蚂蚁视为有效)

思路

利用相对静止,将一类蚂蚁看作静止,另一类蚂蚁速度加倍。由于速度相同的蚂蚁之间永远不会相交,故只需考虑移动的蚂蚁穿过了多少静止的蚂蚁。

题解

数据量较大,需要使用long long存储。

int main(){
    long long n,t; cin >> n >> t;
    string s; cin >> s;
    vector<long long> dots, ants;
    for(long long i = 0; i < n; i++) {
        long long temp; cin >> temp;
        if(s[i] == '0'){
            dots.push_back(temp);
        } else {
            ants.push_back(temp);
        }
    }
    sort(dots.begin(), dots.end());
    long long delta = t * 2;
    long long result = 0;
    // 先排序然后上限减去下限,一个个数会超时。
    for(auto ant : ants){
        result += upper_bound(dots.begin(), dots.end(), ant + delta) - lower_bound(dots.begin(), dots.end(), ant);
    }
    cout << result << endl;
}