小美的元素删除 题解·思路

题目描述

小美有一个数组,她希望删除k个元素,使得剩余的元素两两之间互为倍数关系。你能告诉小美有多少种删除方案吗?由于答案过大,请对10^9+7取模。

输入描述:

第一行输入两个整数 n,k(1≤k≤n≤10^3) 表示数组长度,删除的元素数量。
第二行输入 n 个整数表示数组 a(1≤a[i]≤10^9) 。保证给定的数组中不存在两个相等元素。

输出描述:

输出一个整数表示答案。

示例1

输入

6 4
1 4 2 3 6 7

输出

8

说明

方案1:删除1,4,2,7。方案2:删除1,4,3,7。方案3:删除1,3,6,7。方案4:删除4,2,3,6。

方案5:删除4,2,3,7。方案6:删除4,2,6,7。方案7:删除4,3,6,7。方案8:删除2,3,6,7。

思路:

首先^_^对数据进行判断...好,数据很大取模,long long 走起

接下来头脑风暴ing-_-.动态规划,找状态转移方程!想法如图所示;注意一点,题目保证了不会出现相等的元素,我在此过程中排序了,保证顺序是小到大,如果不这样做,可能会漏分(eg:1 3 4 2,我以4为堆,前三个中只剩下两个的分法是 1 4,就会把2 4这种情况给漏了,所以需要排序)

代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
LL n,k,mod=1e9+7,a[20000],dp[2050][2050];
int main()
{
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    cin>>n>>k;
    for(int i=1;i<=n;i++)
        cin>>a[i],dp[i][1]=1;
    sort(a+1,a+n+1);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<i;j++)
        {
            if(a[i]%a[j]==0)
            {
                for(int h=2;h<=n-k;h++)
                {
                    dp[i][h]+=dp[j][h-1];
                    dp[i][h]%=mod;
                }
            }
        }
    }
    LL res=0;
    for(int i=1;i<=n;i++)
    {
         res=(res+dp[i][n-k])%mod;
    }
     cout<<res<<endl;
    
//     for(int i=1;i<=n;i++)
//     {
       
//         for(int j=1;j<=n;j++)
//         {
//             cout<<dp[i][j]<<' ';
//         }
//         cout<<endl;
//     }
   
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
美赛e题通常会要求解决一个实际的工程或管理问题,涉及到建模、数据分析、优化等方面。解题思路通常分为以下几个步骤: 1. 问题理解:首先要仔细阅读题目,理解问题背景、要求和限制条件。明确问题的目标和约束条件是解题的第一步。 2. 建立数学模型:根据问题要求和数据,建立合适的数学模型来描述问题。可能涉及到微积分、概率统计、线性代数等数学知识。模型的建立需要考虑到实际情况和假设条件,尽量简化和抽象问题方便求解。 3. 数据分析:根据所给数据或者自行获取数据,进行数据的处理和分析。可能需要进行数据清洗、统计分析、可视化等工作,以便更好地理解问题和验证模型。 4. 求解优化问题:根据建立的数学模型,可以采用各种优化方法来求解问题。常用的方法包括线性规划、整数规划、动态规划、遗传算法等。在求解的过程中需要注意约束条件的处理和结果的解释。 5. 结果分析和验证:得到结果后,需要进行结果的分析和验证,看是否符合实际情况和问题要求。如果有必要,可以进行灵敏度分析和稳定性分析,探讨模型的鲁棒性和可靠性。 6. 方案优化和改进:根据结果分析的情况,可以对建模和求解过程进行改进和优化,以提高解题的精度和效率。 以上是美赛e题解思路的一般流程,具体问题具体分析,需要根据具体问题的特点来灵活应对。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值