牛客小白月赛12(b,e,j)华华教月月做数学

本文深入解析了算法竞赛中的三项核心技巧:快速幂与快速乘的巧妙应用、二分搜索的高效实现,以及字符串匹配中find函数的灵活运用。通过实战代码示例,帮助读者掌握这些技巧,并提供了一个关于切巧克力问题的类似题目的解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给不开窍的自己

B题:快速幂 + 快速乘(脑子不够灵光,知道快速幂,却不会联想到快速乘)

#include<bits/stdc++.h>
 
using namespace std;
 
typedef long long ll;
 
ll qu(ll a,ll b,ll p)
{
    ll ans=0;
    a%=p;
     
    while(b)
    {
        if(b%2) ans=(ans+a)%p;
         
        b>>=1;
        a=(a+a)%p;
    }
     
    return ans%p;
}
 
ll qui(ll a,ll b,ll p)
{
    ll ans=1;
    a%=p;
    while(b)
    {
        if(b%2==1) ans=qu(ans,a,p);
         
        b>>=1;
         
        a=qu(a,a,p);
    }
     
    return ans;
}
 
int main()
{
    ll n,a,b,p;
     
    cin>>n;
     
    while(n--)
    {
        cin>>a>>b>>p;
         
         
         
        cout<<qui(a,b,p)<<endl;
    }
     
    return 0;
}

E题:二分(见过的题目,却没有好好去做完)

#include<iostream>
#include<algorithm>

using namespace std;

typedef long long ll;

const ll maxn=100005;

ll L[maxn*2];

ll ans,n,k,sum;

void solve(ll l,ll r)
{
	if(l>=r) return ;
	
    ll t=(l+r)/2+1;
    sum=0;

    for(ll i=0;i<n;++i)
    {
        sum=sum+L[i]/t;
    }

    if(sum>=k)
    {
        ans=max(t,ans);
        solve(t,r);
    }
    else solve(l,t-1);
}

int main()
{
	ll i;

	cin>>n>>k;

	ll t=0;
	for(i=0;i<n;i++) cin>>L[i],t+=L[i];

	t/=k;
//	cout<<t<<endl;
	solve(0,t);

	cout<<ans<<endl;

	return 0;
}

J题:find函数(不久前还用了这个find函数,没仔细考虑数据量,却想到了ac自动机,ac自动机是完全错的,如果有大佬写出来了麻烦给下地址,给萌新瞅瞅!!!)

#include<bits/stdc++.h>
 
using namespace std;
 
const int maxn=1000005;
 
string a,b;
 
int main()
{
    int n,i,j;
     
    cin>>a;
    cin>>n;
     
    while(n--)
    {
        cin>>b;
        string::iterator it1=b.begin(),it2=a.begin();
         
        bool f=1;
        while(it1<b.end()&&it2<a.end())
        {
            it2=find(it2,a.end(),*it1);
            it1++;
            it2++;
        }
         
        if(it1==b.end()&&it2<=a.end()) cout<<"Yes";
        else cout<<"No";
         
        cout<<"\n";
    }
     
    return 0;
}

 

与E题类似:

问题描述

  儿童节那天有K位小朋友到小明家做客。小明拿出了珍藏的巧克力招待小朋友们。
  小明一共有N块巧克力,其中第i块是Hi x Wi的方格组成的长方形。


  为了公平起见,小明需要从这 N 块巧克力中切出K块巧克力分给小朋友们。切出的巧克力需要满足:


  1. 形状是正方形,边长是整数
  2. 大小相同


  例如一块6x5的巧克力可以切出6块2x2的巧克力或者2块3x3的巧克力。


  当然小朋友们都希望得到的巧克力尽可能大,你能帮小Hi计算出最大的边长是多少么?

输入格式

  第一行包含两个整数N和K。(1 <= N, K <= 100000)
  以下N行每行包含两个整数Hi和Wi。(1 <= Hi, Wi <= 100000)
  输入保证每位小朋友至少能获得一块1x1的巧克力。

输出格式

  输出切出的正方形巧克力最大可能的边长。

样例输入

2 10
6 5
5 6

样例输出

2

数据规模和约定

  峰值内存消耗(含虚拟机) < 256M
  CPU消耗 < 1000ms

以上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值