Codeforces Round #811 (Div. 3)

题目链接

A. Everyone Loves to Sleep

思路

把所有闹钟以及他睡觉的时间全部化成分钟然后排序,取睡觉时间的后一个作差,如果睡觉时间是最后一个就取序列中首位+24作差.

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
const int N = 3e3 + 7, INF = 1e9;
int n, m;
int s[N];
void solve()
{
    int n, t1, t2;
    cin >> n >> t1 >> t2;
    for (int i = 1; i <= n; i++)
    {
        int a, b;
        cin >> a >> b;
        s[i] = a * 60 + b;
    }
    sort(s + 1, s + 1 + n);
    int x = t1 * 60 + t2;
    for (int i = 1; i <= n; i++)
    {
        if (s[i] >= x)
        {
            x = s[i] - x;
            cout << x / 60 << " " << x % 60 << endl;
            return;
        }
    }
    x = 24 * 60 - x + s[1];
    cout << x / 60 << " " << x % 60 << endl;
}

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

 

 

B. Remove Prefix

思路

从后往前搜索,遇到第一个重复的数就从此位置向前全部删除。

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
const int N = 1e6 + 7, INF = 1e9;
int s[N];

void solve()
{
    int n;
    cin >> n;
    map<int, int> ma;
    for (int i = 1; i <= n; i++)
        cin >> s[i];
    for (int i = n; i >= 1; i--)
    {
        if (ma[s[i]] == 1)
        {
            cout << i << endl;
            return;
        }
        ma[s[i]]++;
    }
    cout << "0\n";
}

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

 

 

C. Minimum Varied Number

思路

按要求构造即可

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
const int N = 1e6 + 7, INF = 1e9;
char s[N];

void solve()
{
    int a;
    cin >> a;
    vector<int> q;
    for (int i = 9; i >= 1; i--)
    {
        if (a >= i)
        {
            q.push_back(i);
            a -= i;
        }
        if (a == 0)
            break;
    }
    for(int i=q.size()-1;i>=0;i--)
    cout<<q[i];
    cout << endl;
}

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

 

 

D - Color with Occurrences

思路

用每一个子串过一遍主串,记录每个位置最多可以先后染色的位数。

然后从第一个开始,取范围内最长的一个位置向后重复操作。

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
const int N = 1e2 + 7, INF = 1e9;
int s[N];
int dis[N], vis[N];
void solve()
{
    memset(dis, 0, sizeof(dis));
    memset(vis, 0, sizeof(vis));
    string s;
    cin >> s;
    int m = s.size();
    s = " " + s;
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        string ca;
        cin >> ca;
        int cn = ca.size();
        ca = " " + ca;
        for (int k = 1; k <= m; k++)
        {
            int flag = 1;
            for (int j = 1; j <= cn; j++)
            {
                if (s[k + j - 1] != ca[j])
                {
                    flag = 0;
                    break;
                }
            }
            if (flag == 1)
            {
                if (dis[k] < cn)
                {
                    dis[k] = cn;
                    vis[k] = i;
                }
            }
        }
    }
    vector<pair<int, int>> q;
    int l = 1, r = dis[1] + 1;
    q.push_back({vis[1], 1});
    int flag = 0;
    while (1)
    {
        if (r > m)
        {
            flag = 1;
            break;
        }
        int mx = l;
        for (int i = l; i <= r; i++)
        {
            if (dis[i] + i > dis[mx] + mx)
                mx = i;
        }
        if (mx == l)
            break;
        q.push_back({vis[mx], mx});
        l = mx, r = dis[mx] + mx;
    }
    if (flag != 1)
    {
        cout << "-1\n";
        return;
    }
    cout << q.size() << endl;
    for (auto x : q)
        cout << x.first << " " << x.second << endl;
}

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

 

 

E - Add Modulo 10

思路

首先把奇数先操作一次变成偶数,然后就个位只可能是0,2,4,6,8 末尾是0的怎么操作都不会再改变了,单独分为一类.

剩下的数个位总是以2,4,8,6,2,4,8,6循环出现,每循环一次会增加20,可以把每个数都变成以2为结尾,

判断任意两个数的差值是否为20的倍数。

代码

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
const int N = 1e6 + 7, INF = 1e9;
int s[N];

void solve()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cin >> s[i];
        if (s[i] % 10 == 5)
        {
            s[i] += 5;
            continue;
        }
        if (s[i] % 10 == 0)
            continue;
        while (s[i] % 10 != 2)
            s[i] += s[i] % 10;
    }
    sort(s + 1, s + 1 + n);
    if (s[1] % 10 == 0)
    {
        if (s[1] == s[n])
            cout << "YES\n";
        else
            cout << "NO\n";
        return;
    }
    for (int i = 1; i < n; i++)
    {
        if (s[i] == s[i + 1])
            continue;
        int x = abs(s[i] - s[i + 1]);
        if (x % 20 != 0)
        {
            cout << "NO\n";
            return;
        }
    }
    cout << "YES\n";
}

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

 

posted @ 2022-08-02 16:35  黎_lyh  阅读(51)  评论(0)    收藏  举报