牛客小白月赛71(A~F)

A.猫猫与广告

分析

min(a,b) <= min(c,d), max(a,b) <= max(c,d)

代码实现

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
const int N = 100010,mod = 1e9+7;
int n,m;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int a,b,c,d;
    cin >> a>> b >> c >> d;
    if(a*b <= c * d && min(a,b) <= min(c,d) && max(a,b) <= max(c,d)) cout << "YES" << '\n';
    else cout << "NO" << '\n';
    return 0;
}

B.猫猫与密信

分析

找是否存在"lov",loe",lve",ove"。

代码实现

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
const int N = 100010,mod = 1e9+7;
int n,m;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    string s;
    cin >> s;
    for(int i = 0;i < s.size() - 2; i++)
    {
        if(s[i] == 'l' && s[i+1] == 'o' && s[i+2] == 'v') 
        {
            cout << "YES\n";
            return 0;
        }
        if(s[i] == 'l' && s[i+1] == 'o' && s[i+2] == 'e') 
        {
            cout << "YES\n";
            return 0;
        }
        if(s[i] == 'l' && s[i+1] == 'v' && s[i+2] == 'e') 
        {
            cout << "YES\n";
            return 0;
        }
        if(s[i] == 'o' && s[i+1] == 'v' && s[i+2] == 'e') 
        {
            cout << "YES\n";
            return 0;
        }
    }
    cout << "NO\n";
    return 0;
}

c.猫猫与数列

分析

直接去模拟判断是否x^y <= M,用了int128。

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
const ll M = 1e18,mod = 1e9+7;
ll n,m;

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> m;
    __int128_t x = 1,cur,l,r;
    int t = 2;
    l = n, r = m;
    while(x <= M)
    {
//         cout << (ll)l << ' ' << (ll)r << endl;
        cur = 1;
        for(int i = 0;i < r; i++) 
        {
            cur *= l;
            if(cur > M) 
            {
                cout << t << '\n';
                return 0;
            }
        }
        t++;
        l = r, r = cur;
        x = cur;
    }
//     cout << t << '\n';
    return 0;
}

D.猫猫与主人

分析

一种巧妙的思维,一般用O(n^2)是过不了的,那么怎么优化,就是猫猫满足主人的需求后,看是否主人能满足猫猫的期望,类似于双指针,比赛时想不到,还是思维不够,i枚举猫猫,j枚举猫猫当前满足主人的期望的位置,用mx值(当前位置i的猫猫满足主人期望友善值的主人们的友善值最大值)维护满足当前位置为i的猫猫的最大主人友善值,如果该值大于猫猫期望值即可记录答案,否则答案为-1,由于猫猫根据自身友善值排序,那么前一个猫猫满足的主人的期望值,当前猫猫也能满足即mx值可以拿来用,只是无法确定当前主人的友善值能否满足猫猫的期望友善值。

代码实现

#include<bits/stdc++.h>

using namespace std;

const int N = 200010,mod = 1e6+7;
typedef long long ll;
typedef pair<int,int> pii;

int n,m;
int ans[N];
struct Node
{
    int id;
    int l,r;
}host[N],cat[N];

bool cmp1(Node &a,Node &b)
{
    return a.l < b.l;
}

bool cmp2(Node &a,Node &b)
{
    return a.r < b.r;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    cin >> n >> m;
    for(int i = 1;i <= n; i++) cin >> cat[i].l;
    for(int i = 1;i <= n; i++) 
    {
        cin >> cat[i].r;
        cat[i].id = i;
    }
    for(int i = 1;i <= m; i++) cin >> host[i].l;
    for(int i = 1;i <= m; i++) cin >> host[i].r;

    sort(cat + 1,cat + 1 + n,cmp1); //根据猫猫的友善值排序
    sort(host + 1,host + 1 + m,cmp2); //根据主人的期望友善值排序
    int mx = 0;
    for(int i = 1,j = 1;i <= n; i++)
    {
        while(cat[i].l >= host[j].r && j <= m)
        {
            mx = max(mx,host[j].l);
            j++;
        }
        if(mx >= cat[i].r) ans[cat[i].id] = mx;
        else ans[cat[i].id] = -1;
    }
    for(int i = 1;i <= n; i++)
        cout << ans[i] << ' ';
    cout << '\n';
    return 0;
}

E.猫猫与数学

分析

分情况讨论,当gcd(a,b) > 1 直接输出 0。

当gcd(a,b) = 1时,a = b,输出1。

假设a < b,gcd(a+c,b+c) > 1,根据题目样例说明,可以得知gcd(a+c,b-a),要是该值大于1。

如果b-a=1,那么如何增加,也不能使该值gcd(a+c,1)大于1

如果b-a!=1,b-a为定值,那么可以尝试枚举b-a的所有质因子,假设某个质因子为p满足的c=p - (amodp),或当np > a时,c = np - a。枚举b-a的质因子并维护c的最小值。

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
const int N = 100010,mod = 1e9+7;
int n,m;

ll gcd(ll a,ll b)
{
    return !b ? a : gcd(b,a % b);
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    ll a,b;
    cin >> a >> b;
    if(a > b) swap(a,b);
    if(gcd(a,b) > 1) 
    {
        cout << 0 << '\n';
        return 0;
    }
    b -= a;
    if(!b)
    {
        cout << 1 << '\n';
        return 0;
    }
    if(b == 1) 
    {
        cout << -1 << '\n';
        return 0;
    }
    ll ans = 1e18;
    for(ll d = 2;d <= b / d; d++)
    {
        if(b % d == 0)
        {
            ans = min(ans,d - a % d);
            while(b % d == 0) b /= d;
        }
    }
    if(b > 1)
    {
        ans = min(ans, b - a % b);
    }
    cout << ans << '\n';
    return 0;
}

F.猫猫与宝石

分析

一些组合数的公式看来要了解一下。

 来自常用组合数计算公式及推算_组合数公式_ccsu_deer的博客-CSDN博客

当宝石为3时,1*(a_1+a_2+a_3) + 2((a_1+a_2)+(a_1+a_3)+(a_2+a_3))+3(a_1+a_2+a_3) / 2^3.

观察通过一系列的手推算式得到可以发现每个系数可以变成下面形式(这推可能不容易想到)

(C_{2}^{0}\textrm{}+2C_{2}^{1}\textrm{}+3C_{2}^{2}\textrm{})*(a_1+a_2+a_3)/(2^3)

通式

(2^{i-1}+(i-1)*2^{i-2})*(a_1+a_2+...+a_i)/2^i

继续化简得

(i+1)/4*(a_1+a_2+...+a_i)

逆元我用得快速幂,主要是只会这个和扩展欧几里得,不太清楚题目怎么给出这种情况下2的逆元为(M+1)/2,有佬的话可以交流一下。

代码实现

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int,int> pii;
const int N = 200010,mod = 998244353;
int n,m;
ll a[N];

ll qmi(ll a,ll b)
{
    ll res = 1;
    while(b)
    {
        if(b & 1) res = (res * a) % mod;
        a = (a * a) % mod;
        b >>= 1;
    }
    return res;
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    cin >> n;
    for(int i = 1;i <= n; i++) cin >> a[i];
    for(int i = 1;i <= n; i++) a[i] = (a[i] + a[i - 1]) % mod;
    ll ans = 0;
    for(int i = 1;i <= n; i++)
    {
//         ans = qmi(2,mod - 2);
        ans = ((1ll * (i + 1) * a[i]) % mod * qmi(4,mod - 2)) % mod;
        cout << ans << ' ';
    }
    return 0; 
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
牛客 a卷2022年第四季度的华为题目中,要求考生设计一种高效的数据结构,能够支持以下几种操作: 1. 添加一个元素 2. 删除一个元素 3. 查找是否存在某个元素 4. 返回元素的总数 该数据结构要求满足空间复杂度较小、时间复杂度较低、能够快速地进行查找和修改等多种操作。 想要编写这样一种数据结构,我们可以参考许多已有的经典算法与数据结构,如二叉树、哈希表、红黑树等,通过综合利用它们的优点来实现这个问题的解决。 例如,我们可以通过哈希表来存储所有元素的值,并在每个哈希链表的元素中再使用红黑树来进行排序与查找。这样,我们既能够轻松地进行元素的添加和删除操作,也能够在查找较大数据范围和数量时保持较高的速度与效率。同时,由于使用了多个数据结构来协同完成这个问题,我们也能够在空间复杂度上适度地进行优化。 当然,在具体设计这个数据结构的过程中,我们还需要考虑一些实践中的细节问题,例如如何避免哈希冲突、如何处理数据丢失与被删除元素所占用的空间等问题,这都需要相应的算法与流程来进行处理。 总体来看,设计这种支持多种操作的高效数据结构,需要我们具备丰富的算法知识和编程实践能力,同时需要我们在具体处理问题时能够将多种算法和数据结构进行有效地结合。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值