其他分享
首页 > 其他分享> > 2022 杭电多校(3) 补题 2, 9

2022 杭电多校(3) 补题 2, 9

作者:互联网

Cyber Language 字符串输入

签到题
题意:
读入一行小写字母组成的单词,输出每个单词的首字母

注意几点即可:

  1. cin是不会吃掉回车的,所以我们需要getchar手动吃掉回车,

  2. 关了同步后,是不能用getchar的,需要使用cin.get()来吃掉回车。

代码1:关闭快读

void solve(){
    cin >> t;
    getchar();
    while(t --){
        getline(cin,st);
       string ans;
        for(int i= 0; i < st.size(); i++){
            if(i == 0) ans += char(st[i] -'a' + 'A');
            else if(st[i - 1] ==' ') ans += char(st[i] -'a' + 'A');
        }
        cout <<ans << endl;
        st.clear();
    }
}
signed main()
{
    // ios::sync_with_stdio(false);
    // cin.tie(0);
    // cout.tie(0);
    solve();
    return 0;
}

代码2:打开快读

void solve()
{
    cin >> t;
    cin.get();
    while (t--)
    {
        string s;
        getline(cin, s);
        stringstream ss;
        ss << s;
        string str;
        while (ss >> str)
        {
            char ch = str.front();
            ch -= ('a' - 'A');
            cout << ch;
        }
        cout << endl;
    }
}

signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    solve();
    return 0;
}

Package Delivery 贪心

题意:
有n个快递,每个快递只能在第 l 天和第 r 天取件。
每天你可以多次去驿站,但是每次只能带回最多k个物品。
现在你需要带回全部的物品,最小化去驿站的次数。
思路:
因为一天可以去拿多次快递,因此我们只需要考虑最小化去驿站次数即可。
因此对于每一个快递,我们希望在端点处理,

比赛的时候想到了一个策略:
每次选取右端点最小的点,然后同时处理右端点相同的点

我们可以考虑在右端点处理,因为到了右端点就不得不拿,而且右端点处能够同时拿到的快递数目是最多的。

我们遍历结束时间,每次都把开始时间小于当前结束时间的物品都放入优先队列中。
代码:

void slove() {
    vector<pair<int, int>>in;
    vector<int>out;
    cin >> n >> k;
    for (int i = 1; i <= n; i++) {
        int L, R; cin >> L >> R;
        in.push_back({ L,R });
        out.push_back(R);
    }
    sort(in.begin(), in.end());
    sort(out.begin(), out.end());
    out.erase(unique(out.begin(), out.end()), out.end());
    int idx = 0;
    priority_queue<int, vector<int>, greater<int> >que;
    int ans = 0;
    for (int ed : out) {
        while (idx < in.size() && in[idx].first <= ed) {
            que.push(in[idx++].second);
        }
        int cnt = 0;
        while (que.size() && que.top() == ed) {
            cnt++;
            que.pop();
        }
        ans += cnt / k;
        if (cnt%k) {
            int need = k - cnt%k;
            while (que.size() && need --) {
                que.pop();
            }
            ans++;
        }
    }
    cout << ans << endl;
}

参考:https://zhuanlan.zhihu.com/p/546364783

标签:杭电多校,端点,int,cin,st,快递,补题,2022,out
来源: https://www.cnblogs.com/kingwz/p/16523625.html