首页 > 其他分享 >2023.07.21 SMU Summer 2023 Contest Round 5

2023.07.21 SMU Summer 2023 Contest Round 5

时间:2023-07-22 09:45:39浏览次数:49  
标签:Summer arr 21 Contest int s2 ++ vector mp

2023.07.21 SMU Summer 2023 Contest Round 5

A. Points in Segments

给n个,1~m的子集,求1~n中所有没在这些子集中出现过的数字
把子集区间合并为集合s,输出1~n中没有在s中出现过的数
#include "bits/stdc++.h"
using namespace std;
typedef pair<int, int> PII;

int n, m;
vector<PII> segs;
vector<bool> mark(110);

void merge() {
    vector<PII> res;

    sort(segs.begin(), segs.end());

    int st = -2e9, ed = -2e9;
    for (auto seg : segs)
        if (ed < seg.first) {
            if (st != -2e9) res.push_back({st, ed});
            st = seg.first, ed = seg.second;
        }
        else ed = max(ed, seg.second);

    if (st != -2e9) res.push_back({st, ed});

    segs = res;
}

void solve() {
    merge();

    for(auto [i, j] : segs) {
//        cout << i << ' ' << j << endl;
        for(int pos = i; pos <= j; pos ++) {
            mark[pos] = true;
        }
    }
    int cnt = 0;
    for(int i = 1; i <= m; i++) {
        if(!mark[i]) cnt ++;
    }
    cout << cnt << endl;
    if(cnt == 0) {
        return;
    }
    for(int i = 1; i <= m; i++) {
        if(!mark[i]) cout << i << " ";
    }

}

signed main() {

    cin >> n >> m;

    while(n--) {
        int l, r;
        cin >> l >> r;
        segs.push_back({l, r});
    }
    solve();
}

~B. Obtaining the String

给定两个长度相等的字符串,通过每次交换相邻两个字符的操作,把第一个字符串调整为第二个字符串,问最少的操作数和每次操作所交换元素的第一个元素的下标
第一次读错题以为字符串中没有相同的字母,所以这么做了:把第二个字符串的字母,映射成它的下标,则第一个字符串就可以转换为一个数字串,冒泡排序即可
#include "bits/stdc++.h"
using namespace std;

vector<int> arr(100);
vector<int> ans;
int cnt;

void bubbleSort(vector<int> &arr, int n) {
    bool swapped;
    for (int i = 0; i < n - 1; i++) {
        swapped = false;
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换元素位置
                cnt++;
                ans.push_back(j + 1);

                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;

                swapped = true;
            }
        }
        if (!swapped) {
            return;
        }
    }
}

signed main(){
    int n;
    string s1, s2;
    cin >> n;
    cin >> s1 >> s2;

    map<char, int> mp;
    for(int i = 0; i < n; i++) mp[s2[i]] = i;

    for(int i = 0; i < n; i++) {
        if (mp.find(s1[i]) == mp.end()) {
            // 如果 s1[i] 不在 s2 中出现
            cout << -1;
            return 0;
        }
        arr[i] = (mp[s1[i]]);
    }

    bubbleSort(arr, n);

    cout << cnt << endl;
    for(int i : ans) cout << i << ' ';
    cout << endl;
}

如果有相同的字符则不能这么映射了,因为后一个字符会把前一个相同的字符的映射给覆盖掉,所以把mp.first的类型改成queue来维护相同字母的序号即可
#include "bits/stdc++.h"
using namespace std;

vector<int> arr(100);
vector<int> ans;
int cnt;

void bubbleSort(vector<int> &arr, int n) {
    bool swapped;
    for (int i = 0; i < n - 1; i++) {
        swapped = false;
        for (int j = 0; j < n - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                // 交换元素位置
                cnt++;
                ans.push_back(j + 1);

                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;

                swapped = true;
            }
        }
        if (!swapped) {
            return;
        }
    }
}

signed main(){
    int n;
    string s1, s2;
    cin >> n;
    cin >> s1 >> s2;

    //判断是否可以排序成一样的,只要判断两个字符串中每个字母的个数是否分别相等即可
    int ok[30] = {0};
    for(int i = 0;i < n;i++) {
        ok[s1[i] - 96]++;
        ok[s2[i] - 96]--;
    }
    for(int i = 1;i <= 26;i++) {
        if(ok[i] != 0) {
            cout<<-1;
            return 0;
        }
    }


    map<char, queue<int>> mp;
    for(int i = 0; i < n; i++) mp[s2[i]].push(i);

    for(int i = 0; i < n; i++) {
//        if (mp.find(s1[i]) == mp.end()) {
//            // 如果 s1[i] 不在 s2 中出现
//            cout << -1;
//            return 0;
//        }//由于可能存在多个相同的字母,例如,s2中有两个a,而s1中只有一个,这么写检测不出来
        arr[i] = mp[s1[i]].front();
        mp[s1[i]].pop();
    }

    bubbleSort(arr, n);

    cout << cnt << endl;
    for(int i : ans) cout << i << ' ';
    cout << endl;
}

*C. Songs Compression

Ivan有n首歌,第i首歌原始大小为ai,压缩后为bi。他有一个容量为m的U盘。
他想把所有歌复制到U盘中,可以选择任意歌曲压缩,使得总大小不超过m。
求最少需要压缩的歌曲数,如果无法完成则输出-1。
#include<bits/stdc++.h>
using namespace std;

#define int long long
// 定义长长整型便于处理大数

int n, m, t1, t2;
// n:歌曲数 m:U盘容量
// t1:所有歌曲压缩后大小总和 t2:所有歌曲原始大小总和

vector<pair<int, int>> t;
// t数组存储每首歌的(原始大小,压缩后大小)

bool cmp(pair<int, int> a, pair<int, int> b) {
    return a.first - a.second > b.first - b.second;
}
// cmp函数用于排序,按压缩效果从大到小排序

signed main() {

    cin >> n >> m;

    t.resize(n);

    for(int i = 0; i < n; i++){
        cin >> t[i].first >> t[i].second;
        t1 += t[i].second;
        t2 += t[i].first;
    }
    // 读入输入,计算t1和t2

    if(t1 > m){
        cout << -1;
        return 0;
    }
    // 判断压缩后是否能装下,不能则输出-1

    sort(t.begin(), t.end(), cmp);
    // 排序

    for(int i = 0; i < n; i++){
        if(t2 <= m) {
            cout << i;
            return 0;
        }
        t2 -= t[i].first - t[i].second;
    }
    // 贪心算法,从效果最大的开始压缩,直到容量满足

    cout << n;

    return 0;
}

标签:Summer,arr,21,Contest,int,s2,++,vector,mp
From: https://www.cnblogs.com/Ruiko-Lan/p/17572866.html

相关文章

  • 2024-7-21巅峰极客
    菜鸡打ctf,做了一天牢,算上签到题一共做上两道签到  数学但高中 给出了一大串,一开始没看懂,学姐提醒才知道要画图python太菜,只好手动一个一个粘公式画图网址:https://www.desmos.com/calculator?lang=zh-CN最后生成的图片: 然后试了半天sql没注进去,大佬的代码也没看懂......
  • 2023.7.21
    今天和室友约好早起去跑步了五点半起床 !体验了一下早起的世界,其实外面当时天已经亮了,而且路上已经有了很多人然后和室友打着语音一边唠嗑一边慢跑其实还是蛮开心的,虽然起床很痛苦……明天继续!......
  • 关于高精度计算的研究(1)——高精度加、减运算(2023-07-21)
    1、引入在C++中,我们常会需要做加减乘除等等运算首先我们来熟悉一下c++的计算符号:+(加号)             -(减号、负号)                  *(乘号)                    /(除号......
  • 7.21 后记
    我的图逃走了考试T1瞎搞题(老师认证)T2矩阵找最大环,可以推出一个只含两个点3个坐标的式子,\(O(n^3)\)找最大值,再枚举剩下一个点\(n*m\le2e5\),说明\(n\)或\(m\)小于400,\(O(n*m+400)\)可以允许T3做法好想,但缩点+分数规划+树形dp毒瘤,改不动T4括号序列,难难难下......
  • 《摆与混》第十九章--7月21日--周五
    明天就是周末,我闻到了些许畅快1.今天做了什么:今天9点起床(好耶)。洗漱后,简单吃了个早饭(肉丝粉,比我妈做的好吃),上午正常学习,又看了会小说,下午去解救了一下电动车被拖走的哥们(笑死我了,小丑一个),5点半出发健身锻炼(坚持),晚上看比赛加上经典PTA,大计划周末篇!!!2.解决了什么问题:Java课程推进,PT......
  • 7-21打卡
    publicclassHanoiTower{publicstaticvoidmain(String[]args){intn=3;//圆盘的数量charfrom='A';//起始柱子charaux='B';//辅助柱子charto='C';//目标柱子solveHanoi(n,from,a......
  • 7月21日
    7月21日今天早上七点多起的床,起来的时候就开始下雨了,盼星星盼月亮终于下雨了。上午下雨就在家呆着了,早上歇了一会儿打了会儿游戏,然后就帮着一块包饺子了,过了一会儿刷了会儿科目一的题,然后开始吃饭,完事之后就开始午休,睡了一会儿,等醒了之后就开始写pta上的题,然后看了会儿黑马程序员......
  • 7.21
    今天上午建好了那个程序设计的小组群,感觉还是不太舒服睡了一上午下午睡到三点起来玩了一会就去练车去了晚上看了一会大道至简,看了一多半了马上就能写读后感了还打了一会代码#include<iostream>#include<cctype>#include<cstring>usingnamespacestd;boolisnum(string......
  • 7.21语言结构学习
    语言结构学习第一题,答案;第二题,答案写,第一题,答案多少;第二题,答案多少......
  • 20230721巴蜀暑期集训测试总结
    T1似乎想复杂了。搓了一个\(O(Q\sqrt{n\logn})\)的做法,成功跳过正解。结果考后发现普通分块就可以\(O(Q\sqrtn)\)。而且似乎还WA了一些点。根据题意可以发现\(b_i\)为\(1\)当且仅当\(i\)在二进制下有奇数个\(1\)。这个可以用来快速求\(b_i\)。再观察性质,发现\(......