SMU Spring 2023 Trial Contest Round 10

A. Remove Duplicates

题意大概就是从左到右数字最先数完的最先输出

 

所以我们可以在输入每个数时记录每个数的出现次数,然后在循环一遍,每次该数字的次数减1,当数字的次数只剩1的时候就输出这个数字.

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

using namespace std;

const int N = 2e3 + 10, mod = 1e9 +7;

//typedef long long ll;
typedef pair<int,int> PII;
//queue<PII> q1;
map<vector<int>, int > mp;
//priority_queue <int,vector<int>,greater<int> > q2;
int n,m,t,k;
/*
*/
vector<int> a, b;
void solve()
{
    cin >> n;
    set<int> S;
    vector<int> a,b;
    int vis[N] = {0};
    for(int i = 0;i < n; i++){
        int x;
        cin >> x;
        vis[x] ++;
        a.push_back(x);
    }
    for(int i = 0;i < a.size(); i++){
        if(vis[a[i]] == 1){
            b.push_back(a[i]);
        }
        else
        vis[a[i]]--;
    }
    cout << b.size() << endl;
    for(auto i : b){
        cout << i << ' ' ;
    }
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int Ke_scholar = 1;
    //cin >>  Ke_scholar ;
    while(Ke_scholar--)
        solve();
    return 0;
}

 

B. File Name

题意大概就是说不能出现三个及以上的x

 

所以我们每找到一个x,就取找它后面有多少个x,如果大于2,ans就加上x的个数 - 2,因为题目要求是可以允许两个及以下x存在的

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

using namespace std;

const int N = 2e3 + 10, mod = 1e9 +7;

//typedef long long ll;
typedef pair<int,int> PII;
//queue<PII> q1;
map<vector<int>, int > mp;
//priority_queue <int,vector<int>,greater<int> > q2;
int n,m,t,k;
/*
*/
vector<int> a, b;
void solve()
{
    cin >> n;
    string s;
    cin >> s;
    int ans = 0;
    for(int i = 0; i < s.size(); i++){
        if(s[i]!='x')
            continue;
        m = i;
        while(s[i] == 'x' && i < s.size()){
            i++;
        }
        if(i - m > 2)
            ans += (i - m - 2);
    }
    cout << ans << endl;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int Ke_scholar = 1;
    //cin >>  Ke_scholar ;
    while(Ke_scholar--)
        solve();
    return 0;
}

 

C. Letters

题意大概就是给你n层楼,m封信件,再给你每层楼有多少房间和m件信封需要送到多少号房间

 

因为信封给的是房间号,所以我们可以先用前缀和将前面的房间存起来,对于每封信件我们可以二分找到房间数,然后减去它上层楼的房间数就是当前楼的第几间房了.

 

当然由于他给的信封房间号是保证递增的,也可以每次判断上一封信件放在几楼,再跟进当下的房间数在其基础上进行加多少房间或者不加(就在当前楼).

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

using namespace std;

const int N = 2e3 + 10, mod = 1e9 +7;

//typedef long long ll;
typedef pair<int,int> PII;
//queue<PII> q1;
map<vector<int>, int > mp;
//priority_queue <int,vector<int>,greater<int> > q2;
int n,m,t,k;
/*
*/
vector<int> a, b;
void solve()
{
    cin >> n >> m;
    vector<int> a,b;
    cin >> k;
    a.push_back(k);
    for(int i = 1;i < n; i++){
        int x;
        cin >> x;
        a.push_back(x + a[i - 1]);
    }
    for(int i = 0 ;i < m; i++){
        int x;
        cin >> x;
            auto it = lower_bound(a.begin(),a.end(),x) - a.begin();
           if(lower_bound(a.begin(),a.end(),x) == a.begin())
               cout << 1 << ' ' << x << endl;
           else
               cout << it + 1 << ' ' << x - a[it - 1] << endl;
    }
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int Ke_scholar = 1;
    //cin >>  Ke_scholar ;
    while(Ke_scholar--)
        solve();
    return 0;
}

 

D.Almost Arithmetic Progression

题意大概就是对每个数+1,-1,或者不变,问是否可以组成一个等差数列

 

对于小于2个数的特殊处理一下,其余由于前面两个数三种变化各有9种组合方式,所以我们可以直接暴力求解

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

using namespace std;

const int N = 1e5 + 10, mod = 1e9 +7;

//typedef long long ll;
typedef pair<int,int> PII;
//queue<PII> q1;
map<vector<int>, int > mp;
//priority_queue <int,vector<int>,greater<int> > q2;
int n,m,t;
/*
*/
void solve()
{
    cin >> n;
    vector<int> a(n);
    for(int i = 0;i < n; i++){
        cin >> a[i];
    }
    if(n <= 2){
        cout << 0 << endl;
        return ;
    }
    int ans = inf;
    for(int i = -1;i <= 1;i ++){
        for(int j = -1; j<= 1; j++){
            vector<int> b(a);
            b[0] += i;
            b[1] += j;
            int d = b[1] - b[0];
            int res = abs(i) + abs(j);
            for(int k = 2; k < n && res <= ans; k++){
                int dd = b[k] - b[k - 1];
                if (dd == d)
                    continue;
                else if(dd == d + 1){
                    b[k]--;
                    res ++;
                }
                else if(dd == d - 1){
                    b[k] ++;
                    res ++;
                }
                else
                    res = inf;
            }
            ans = min(res, ans);
        }
    }
    if(ans == inf)
        cout << -1 << endl;
    else
        cout << ans << endl;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int Ke_scholar = 1;
    //cin >>  Ke_scholar ;
    while(Ke_scholar--)
        solve();
    return 0;
}

 

E.Bus Video System

题意大概就是给你公交车每站上下车的人数和公交车的最大限乘人数,问你在开始的时候公交车人数有多少情况

 

可以先求出前缀和,找到上车人数最多的时候,用限乘减去它就是可以在此之前车上最多承载的人数,当然也有可能全是下车的,所以也要找到下车人数最多的时候,即要保证在最开始车上有这么多人,当然车上最开始也是可以一个人都没有的,所以还要两者的差值再加上+1

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

using namespace std;

const int N = 1e5 + 10, mod = 1e9 +7;

//typedef long long ll;
typedef pair<int,int> PII;
//queue<PII> q1;
map<vector<int>, int > mp;
//priority_queue <int,vector<int>,greater<int> > q2;
int n,m,t;
/*
*/
int a[N];
void solve()
{
    cin >> n >> m;
    for(int i = 1; i <= n; i++){
        cin >> a[i];
        a[i] = a[i] + a[i - 1];
    }
    int r = min(m, m - *max_element(a + 1, a + n + 1));
    int l = max(0ll, -*min_element(a + 1, a + n + 1));
    cout << max(0ll, r - l + 1) << endl;
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int Ke_scholar = 1;
    //cin >>  Ke_scholar ;
    while(Ke_scholar--)
        solve();
    return 0;
}

 

F.Mentors

题意大概就是给出n个人的能力值,能力值大的可以当能力值小的人的老师,但是现在有m个矛盾,发生矛盾的两人不能成为师生,问最后每个人可以当多少人的老师

 

可以先用a,b两个数组存能力值,对b数组排序,再用一个数组c存每个人可以成为多少人的老师,对循环a数组,对每个人的能力值去b数组中二分查找,其对应下标就是该数组a中能力值的人的学生数,最后对输入的各个矛盾,判断谁能力值更大,大的那个人学生数减1即可

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

using namespace std;

const int N = 1e5 + 10, mod = 1e9 +7;

//typedef long long ll;
typedef pair<int,int> PII;
//queue<PII> q1;
map<vector<int>, int > mp;
//priority_queue <int,vector<int>,greater<int> > q2;
int n,m,t,k;
/*
*/
int a[N];
void solve()
{
    cin >> n >> k;
    vector<int> a(n);
    for(int i = 0;i < n; i++){
        cin >> a[i];
    }
    auto b = a;
    vector<int> c(n,0);
    sort(b.begin(), b.end());
    for(int i = 0;i < a.size(); i++){
        c[i] = lower_bound(b.begin(), b.end(),a[i]) - b.begin();
    }
    while(k--){
        int x,y;
        cin >> x >> y;
        x--,y--;
        if(a[x] > a[y])
            c[x]--;
        else if(a[x] < a[y])
            c[y]--;
    }
    for(auto i : c)
        cout << i << ' ';
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int Ke_scholar = 1;
    //cin >>  Ke_scholar ;
    while(Ke_scholar--)
        solve();
    return 0;
}

 

G.Petya's Exams

题意大概就是学生要在n天内完成m场考试,给出每场考试知道的日期和考试日期以及需要为这场考试复习需要多少天,问能否给出一个合理的规划将所有每场考试开考前复习完,不能就输出-1,能就输出n天的规划

 

在输入的时候可以先标记每场考试的日期,在之后的考试日期有冲突的可以直接输出-1,再就是可以对每场考试按终止日期排序,在此之前每过一天就复习天数减1,如果到考试时复习天数还未减至0说明不能完成复习,直接输出-1即可

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

using namespace std;

const int N = 1e5 + 10, mod = 1e9 +7;

//typedef long long ll;
typedef pair<int,int> PII;
//queue<PII> q1;
map<vector<int>, int > mp;
//priority_queue <int,vector<int>,greater<int> > q2;
int n,m,t,k;
/*
*/
int a[N];
struct Time{
    int s,e,d,id;
    bool operator < (const Time &s)const {
        if(e != s.e) return e < s.e;
    }
}day[N];
void solve()
{
    cin >> n >> m;
    vector<int> a(n + 1);
    for(int i = 0;i < m; i++){
        cin >> day[i].s >> day[i].e >> day[i].d ;
        day[i].id = i + 1;
        if(a[day[i].e]) {
            puts("-1");
            exit(0);
        }
        a[day[i].e] = m + 1;
    }
    sort(day, day + n);
    for(auto [s,e,d,id] : day){
        for(int i = s;i < e && d > 0; i++){
            if(a[i])
                continue;
            a[i] = id;
            d--;
        }
        if(d == 0)
            continue;
        puts("-1");
        exit(0);
    }
    for(int i = 1;i <= n; i++){
        cout << a[i] << ' ';
    }
}
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    int Ke_scholar = 1;
    //cin >>  Ke_scholar ;
    while(Ke_scholar--)
        solve();
    return 0;
}

 

posted @ 2023-05-04 21:56  Ke_scholar  阅读(7)  评论(0编辑  收藏  举报