NOIP2011提高组Day 2

本文解析了两道经典的算法题目,第一题通过快速幂和二项式定理解决组合问题,第二题则采用二分搜索结合前缀和的方法求解最优矿石选择问题。

T1


OJ传送门
洛谷传送门
这道题当时快速幂的模板写错了,很震惊居然还能拿到60分
然后就是广为人知的数学选修2-3的二项式定理,如果我没记错的话,是这样的:
那这道题最重要的一行代码就是:int ans=power(a,n)*power(b,m)%mod*C(k,m)%mod;

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

typedef long long ll;
const ll MOD = 10007;
ll rec[1010][1010];
ll a,b,k,n,m;

ll C(ll n,ll r)
{
    if(n==r || r==0)    return rec[n][r]=1;
    if(rec[n][r])    return rec[n][r];
    return rec[n][r] = (C(n-1,r)+C(n-1,r-1)) % MOD;
}
ll power(ll x, ll k)
{
    ll ans = 1;
    while(k)
    {
        if(k & 1)    ans = ans * x % MOD;
        x = x * x % MOD;
        k >>= 1;
    }
    return ans;
}
int main()
{
    scanf("%lld%lld%lld%lld%lld", &a, &b, &k, &n, &m);
    ll ans = power(a, n) * power(b, m) % MOD * C(k, m) % MOD;
    printf("%lld",ans);
    return 0;
}

T2



OJ传送门
这道题用二分和前缀和的做法,在最大质量和最小质量中间二分,但为了避免忘记特判特殊端点,二分的真正范围是max_weight+2与min_weight-1之间。具体思想是,W越小,Y越大;W越大,Y越小。当Y>S时,我们要增大W的值,使abs(Y-S)变小,反之同理。
维护前缀和就维护pre_v[i]维护到第i个矿石时满足条件的所有矿石的价值,pre_cnt[i]维护的是前i个矿石符合条件的矿石数。

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;

typedef long long ll;
const int MAXN = 2e5+5;
ll n, m, S, l_i, r_i;
ll max_weight = -1, min_weight = 99999999;
ll Y, sum, answer;
ll l[MAXN], r[MAXN];
ll w[MAXN], v[MAXN], pre_v[MAXN], pre_cnt[MAXN];

bool check(ll W)
{
    memset(pre_v, 0, sizeof(pre_v));
    memset(pre_cnt, 0, sizeof(pre_cnt));
    Y = 0, sum = 0;
    for(ll i = 1; i <= n; i++)
    {
        if(w[i] >= W)
        {
            pre_v[i] = pre_v[i-1] + v[i];
            pre_cnt[i] = pre_cnt[i-1] + 1;
        } else {
            pre_v[i] = pre_v[i-1];
            pre_cnt[i] = pre_cnt[i-1];
        }
    }
    for(ll i = 1; i <= m; i++)
        Y += (pre_cnt[r[i]] - pre_cnt[l[i]-1]) * (pre_v[r[i]] - pre_v[l[i]-1]);
    sum = llabs(Y - S);
    if(Y > S) return true;
    else return false;
}

int main()
{
//  freopen("qc.in","r",stdin);
//  freopen("qc.out","w",stdout);
    scanf("%lld%lld%lld", &n, &m, &S);
    for(ll i = 1; i <= n; i++)
    {
        scanf("%lld%lld", &w[i], &v[i]);
        max_weight = max(max_weight, w[i]);
        min_weight = min(min_weight, w[i]);
    }
    for(ll i = 1; i <= m; i++)
        scanf("%lld%lld", &l[i], &r[i]);
    ll left = min_weight-1, right = max_weight+2;
    ll answer = 99999999999;
    while(left<=right)
    {
        ll mid = (left+right) >> 1;
        if(check(mid)) left = mid+1;
        else right = mid-1;
        if(sum < answer) answer = sum;
    }
    printf("%lld", answer);
    return 0;
}

转载于:https://www.cnblogs.com/stooge/p/9885183.html

内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值