[牛客寒假算法基础集训营6总结]

39 篇文章 0 订阅
25 篇文章 0 订阅

A.[简单数学思维递推]

易得m题所组成所有分数集合中极小值m*6 极大值m*9,  因其子和差值均一, 则有若干组合组成连续闭区间[6*m, 9*m]

易推得6数极小时应有其余三数组合极大 则有公式 ans = max(-(n - m * ll(6)) + m, ll(0)) (未化简)

 

 

-----------------------------------------------------------------分割线--------------------------------------------------------------------------------

B. [二分答案/数学]

 

 

观察其数据范围, 暴力枚举不妥, 可采用二分答案验证或数学方式求解, 验证条件为等差数列求和 

ll(mid * (n + n + (mid - 1) * d) / 2) >= m

ll cal(ll mid)
{
    return ll(mid * (n + n + (mid - 1) * d) / 2);
}


    ll fst = 1, lst = x, mid;
 
    for(int i = 0; i < 30; i++)
    {
        mid = (fst + lst) / 2;
 
        if(cal(mid) > m)
            lst = mid;
        else
            fst = mid;
    }
     
    mid += 10; //范围控制防止整形误差
          
    while(cal(mid - 1) >= m)
        mid--;

 

 

 

 -------------------------------------------------------------------分割线-------------------------------------------------------------------

C . [基础贪心]

按val大值优先放置, 则结果必定最优

时间复杂度O(n*log2n) + O(n)

 -------------------------------------------------------------------分割线-------------------------------------------------------------------

D.[贪心 / 模拟]

最优策略为首先选择待处理数奇数且下一数不为零时, 其次当前数直接选尽

 

 -------------------------------------------------------------------分割线-------------------------------------------------------------------

E.[基础二维差分/前缀和/预处理  不定矩阵指针处理]

不定矩阵处理

1.vector  

     vector <element> arr[MAXN];   arr[x].push_back(element);

2.矩阵压缩

    int retpos(int x, int y)     return (x * (m + 1) + y);

3.指针数组

    int *rs[MAXN];          for(int i = 0; i < n; ++i)     rs[i] = new int[m + 1];

4.主函数内直接开二维数组

int n, m; cin>>n>>m; int arr[n + 1][m + 1];

题解:

二维前缀和模板

 

 

 -------------------------------------------------------------------分割线-------------------------------------------------------------------

 

 -------------------------------------------------------------------分割线-------------------------------------------------------------------

 

 

 -------------------------------------------------------------------分割线-------------------------------------------------------------------

 

 

 -------------------------------------------------------------------分割线-------------------------------------------------------------------

 

 -------------------------------------------------------------------分割线-------------------------------------------------------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值