2022“杭电杯”中国大学生算法设计超级联赛(2)

本文分享了两道算法竞赛题目,涉及字符串操作(排除std::make_tuple)和区间重叠问题的解决方法。通过实例代码解析,探讨了如何利用C++和Python进行高效编程,并介绍了区间遍历算法在实际比赛中的应用。
摘要由CSDN通过智能技术生成

2022“杭电杯”中国大学生算法设计超级联赛(2)

[题目链接](Search Result (hdu.edu.cn))

B C++ to Python

题目大意

输入一个字符串,输出该字符串除了std::make_tuple的所有内容。

题解

见代码。

代码

#include <iostream>
#include <string>
using namespace std;
const int maxn = 1e2 + 5;
int t;
int main()
{
    cin >> t;
    while (t--)
    {
        string s;
        cin >> s;
        for (int i = 0; i < s.size(); i++)
            if (isdigit(s[i]) || s[i] == ',' || s[i] == '(' || s[i] == ')' || s[i] == '-')
                cout << s[i];
        cout << endl;
    }
    return 0;
}

G Snatch Groceries

题目大意

有n个区间,形如[left,right],从前往后遍历,一旦有区间重合则立马退出,问有多少区间被遍历。

题解

首先把这n个区间按大小排序(因为题目中是无序的),然后判断后一个区间的左端点是否在前一个区间内即可,一旦在,退出循环。

代码

#include <iostream>
#include <queue>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1e5 + 5;
typedef pair<int, int> P;
int t, n;
struct Node
{
    int begin, end;
    bool operator<(const Node &a) const
    {
        if (begin == a.begin)
            return end < a.end;
        return begin < a.begin;
    }
} a[maxn];
int main()
{
    scanf("%d", &t);
    while (t--)
    {
        int res = 0;
        scanf("%d", &n);
        for (int i = 1; i <= n; i++)
        {
            scanf("%d%d", &a[i].begin, &a[i].end);
        }
        sort(a + 1, a + 1 + n);
        bool flag = 1;
        for (int i = 1; i < n; i++)
        {
            if (a[i].begin < a[i + 1].begin && a[i].end < a[i + 1].begin)
                res++;
            else
            {
                flag = 0;
                break;
            }
        }
        if (flag)
            res++;
        printf("%d\n", res);
    }
    return 0;
}

I ShuanQ

题目大意

有一个质数M,P和Q在mod M下互为逆元,有两个式子E=RP modM,R=EQ modM,现已知P,Q,E的值,M未知,求R,若不存在,则输出ShuanQ。

题解

因为P和Q在mod M下互为逆元,所以kM=PQ-1(k≥1),且可得M是kM的一个质因子。

已知P,Q<M,所以满足条件的质因子只有一个,因为如果有多个满足要求的质因子M1和M2, 那么kM=M1M2>PQ,与kM=PQ-1矛盾。

接下来证明以下两个式子E=RP modM,R=EQ modM,当根据第二个式子得出R时,第一个式子也成立。把第二个式子代入第一个式子得,E=(EQ modM * P) modM=(EQ modM * P modM) modM(因为P<M)=(EPQ) modM=E modM=E(因为E<M)。

所以该题只需要找到M,然后根据第二个式子算出R即可,若M不存在则输出ShuanQ。

代码

#include <iostream>
#include <cmath>
using namespace std;
const int maxn = 1e2 + 5;
typedef long long ll;
ll t;
int main()
{
    scanf("%lld", &t);
    while (t--)
    {
        ll P, Q, E;
        scanf("%lld%lld%lld", &P, &Q, &E);
        ll kM = P * Q - 1, M;
        for (ll i = 2; i <= sqrt(kM); i++)
        {
            if (kM % i)
                continue;
            while (kM % i == 0)
                kM /= i;
            M = i;
        }
        if (kM > 1)
            M = kM;
        if (M > P && M > Q && M > E)
            printf("%lld\n", (E * Q) % M);
        else
            printf("shuanQ\n");
    }
    return 0;
}

L Luxury cruise ship

题目大意

有一个数字N,问是否可以用7、31、365组成,若能,输出最小个数,若不能,输出-1。

题解

代码


C Copy

题目大意

题解

代码


H Keyboard Warrior

题目大意

题解

代码


未完。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值