2022“杭电杯”中国大学生算法设计超级联赛(3)题解报告

本文探讨了四个编程挑战:拼音转大写、快递调度、曼哈顿距离计算与排列组合,展示了如何运用贪心、动态规划等算法技巧解决实际问题。

Problem C. Cyber Language

题意:

给定小写的中文拼音,输出大写的首字母。

题解:

将第一个字母和空格后的字母大写输出就可以了。

代码:

#include<iostream>
#include<string>
#include<cstring>
using namespace std;

string s;

void solve(){
    getline(cin, s);
    cout << (char)(s[0] - 'a' +  'A');
    int len = s.length();
    bool flag = false;
    for(int i = 0; i < len; i++){
        if(s[i] == ' '){
            flag = true;
            continue;
        }
        if(flag){
            cout << (char)(s[i] - 'a' + 'A');
            flag = false;
        }
    }
    cout << '\n';
}

int main(){
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int t = 1;
    cin >> t;
    getline(cin, s);
    while(t--){
        solve();
    }
}

Problem I. Package Delivery

题意;

有n个快递,给定到货日期和截止日期,每次最多拿k个,问最少需要几次拿完。

题解:

贪心。

首先按到货日期为第一要素排序,然后按照截止日期从早到晚依次看。我们设置一个缓冲地带,对于一个截止日期,我们首先看缓冲地带是否有截止日期早于当先考虑的截止日期,有则拿;然后考虑快递站里的包裹是否有到货日期早于该截止日期的,有则考虑它的截止日期,如果早于当前考虑的截止日期,则拿,否则放入缓冲区;最后再检查缓冲区,因为要尽可能拿满k个。

代码:

#include<iostream>
#include<algorithm>
#include<vector>
#include<queue>
#include<set>
#define int long long
using namespace std;

const int N = 1e5 + 10;

int n, k;

struct pak{
    int l, r;
    bool operator < (const pak a) const{
        return r > a.r;
    }
}p[N];

bool cmp(pak a, pak b){
    return a.l < b.l;
}

void solve(){
    cin >> n >> k;
    set<int> s;
    for(int i = 1; i <= n; i++){
        cin >> p[i].l >> p[i].r;
        s.insert(p[i].r);
    }
    sort(p + 1, p + 1 + n, cmp);
    priority_queue<pak> q;
    int cnt = 0, ans = 0, now = 1;
    auto i = s.begin();
    while(i != s.end()){
        int it = *i;
        while(!q.empty() && q.top().r <= it && cnt < k){
            q.pop();
            cnt ++;
        }
        while(now <= n && p[now].l < it && cnt < k){
            if(p[now].r <= it) cnt ++;
            else q.push(p[now]);
            now ++;
        }
        while(cnt && !q.empty() && cnt < k){
            cnt ++;
            q.pop();
        }
        if(cnt) cnt = 0, ans ++;
        else i ++;
    }
    cout << ans  << '\n';
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    int t = 1;
    cin >> t;
    while(t--){
        solve();
    }
}

Problem K. Taxi

题意:

二维坐标n个点,每个点有一个费用w,q次查询,每次给定一个坐标,社曼哈顿距离为d,问给定点到n个点中min(d, w)的最大值。

题解:

如果没有 w 的限制,那么是经典问题。根据 |x| = max(x, −x),有

max {|x′

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值