SMU Summer 2023 Contest Round 10(ICPC — International Collegiate Programming Contest Asia Regional Contest, Yokohama,2018)

SMU Summer 2023 Contest Round 10(ICPC — International Collegiate Programming Contest Asia Regional Contest, Yokohama)

Problem A

Digits Are Not Just Characters

模拟,注意以下几点,用\(s\)代表比较的字符串,\(str\)代表原字符串:

  • s 和 str 一样,排 str 后面.
  • 前面部分相同的情况下, s 和 str 谁先碰到数字谁排前面.
  • 碰到数字比较谁的数字更小, 谁排前面.
  • 剩下就逐字符比较.
  • 如果 s 是 str 的前缀, 那 s 应该放前面, 否则放后面.
#include<bits/stdc++.h>

using namespace std;

int main() {
    int n;
    cin >> n;
    vector<string> a(n);
    string str;
    cin >> str;
    for (auto &i : a) cin >> i;

    auto check = [&](string s) {
        if (s == str) return false;

        int i = 0, j = 0;
        for (; i < s.size() && j < str.size(); i++, j++) {
            if (isdigit(s[i]) && !isdigit(str[j])) return true;
            if (isdigit(str[j]) && !isdigit(s[i])) return false;

            int nums = 0, numstr = 0;
            while (isdigit(s[i]) && i < s.size()) {
                nums = nums * 10 + s[i] - '0';
                i++;
            }
            while (isdigit(str[j]) && j < str.size()) {
                numstr = numstr * 10 + str[j] - '0';
                j++;
            }
            if (nums < numstr) return true;
            else if (nums > numstr) return false;

            if (s[i] < str[j]) return true;
            else if (s[i] > str[j]) return false;
        }

        if (s.size() < str.size()) return true;
        return false;
    };

    for (auto i : a) {
        if (check(i)) cout << "-\n";
        else cout << "+\n";
    }

    return 0;
}

Problem B(动态规划)

Arithmetic Progressions

\(dp[i][j]\)\(i,j\)项表示某个等差数列是以\(a[i],a[j]\)结尾的,然后去二分找到他的下一项找到了就进行转移,最大值随着更新

#include <bits/stdc++.h>
#define int long long
#define endl '\n'

using namespace std;

signed main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int n;
    cin >> n;
    vector<int> a(n);
    for(auto &i : a) cin >> i;

    sort(a.begin(), a.end());
    vector dp(n,vector<int>(n,2));

    int ans = 2;
    for(int i = 0;i < n;i ++){
        for(int j = 0;j < i;j ++){
            int p = lower_bound(a.begin(), a.end(),a[j] - a[i] + a[j]) - a.begin();
            if(a[p] - a[j] == a[j] - a[i])
                dp[i][j] = max(dp[i][j], dp[j][p] + 1);
            ans = max(ans,dp[i][j]);
        }
    }

    cout << ans << '\n';
    return 0;
}

Problem C

Emergency Evacuation

如果两个人到出口的时间是相等的,那么其中一个就要多等一个时刻,相应的,如果有多个人到出口时间相等,那么除了第一个人以外,其余人都要往后等\(1,2,3,\dots\)时刻,最终取最后一个人到达出口的时间就是答案了.

#include<bits/stdc++.h>

using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int r,s,p;
    cin >> r >> s >> p;
    std::vector<int> v(p);

    for(int i = 0,x,y;i < p;i ++){
        cin >> x >> y;
        v[i] = r - x + 1;
        if(y > s) v[i] += y - s;
        else v[i] += s - y + 1;
    }

    sort(v.begin(), v.end());
    for(int i = 0;i < p - 1 ;i ++)
        if(v[i + 1] <= v[i]) v[i + 1] = v[i] + 1;

    cout << v.back() << '\n';


    return 0;
}

posted @ 2023-08-10 10:47  Ke_scholar  阅读(9)  评论(0编辑  收藏  举报