ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-07-27 10:04:21  阅读:132  来源: 互联网

标签:杭电多校 端点 int cin st 快递 补题 2022 out


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个物品。
现在你需要带回全部的物品,最小化去驿站的次数。
思路:
因为一天可以去拿多次快递,因此我们只需要考虑最小化去驿站次数即可。
因此对于每一个快递,我们希望在端点处理,

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

  • 如果有剩余快递,优先处理剩余快递。

  • 处理的时候,如果当前快递的左端点大于剩余快递的右端点,则顺便把剩余快递取了。

  • 每次只取K的整数倍,如果不够整数倍,则剩下不取。

  • 再集中处理剩下的快递。
    但是太难写,下面是正确解法

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

  • 如果我们今天拿的东西已经是K的整数倍的话,就没必要再考虑其他的。

  • 如果不是k的整数倍,我们就补到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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有