【NOIP模拟8.6】

T1 gift

Solution:

  • 题目描述显然就是一个背包,然而就是不知道怎么拿背包做QAQ 爆搜+剪枝三十分 正解的确是01背包
  • 首先将 w 从小到大排序,题意可以转化为买其中若干物品后,剩余钱数小于所有剩余物品代价的最小值的方案数,那么我们按照排序后顺序做背包可以方便很多。
  • f[i][j]表示用编号为 i ~n的物品组合成的,剩余容量为 j 的方案数,初始值f[n+1][m]=1
  • 我们倒序枚举每一个物品时,用背包计算方案数
  • 假设枚举到i的时候,前 i1 种物品全部选,第i个物品不选, i+1 ~ n 的物品已经做完了背包,由于我们已经排好序,所以i物品一定是不选的物品之中代价最小的一个,所以可行解的范围应该在[sum[i1],sum[i2])之间
  • 那么满足题意的方案数应该是 min(sum[i],m)k=sum[i1]dp[i+1][k] ,累加到答案里即可
  • 注意特判一下 ni=1w[i]<=m 的情况
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int N=1010,mod=1e9+7;
int n,m;
int f[1010][1010],sum[1010],w[1010];//做 i~n 物品的背包,剩余空间为 j 的方案数 
long long ans;

int main()
{
    freopen("gift.in","r",stdin);
    freopen("gift.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        scanf("%d",&w[i]);
    sort(w+1,w+n+1);
    for(int i=f[n+1][m]=1;i<=n;i++) sum[i]=sum[i-1]+w[i]; 
    for(int i=n;i>=1;i--)
    {
        for(int j=sum[i-1],k=min(m+1,sum[i]);j<k;j++)   ans+=f[i+1][j];
        for(int j=m;j>=0;j--)
        {
            f[i][j]=f[i+1][j];  
            if(j+w[i]<=m) (f[i][j]+=f[i+1][j+w[i]])%=mod;   
        }
    }
    printf("%lld",max(ans,1ll)%mod);
    return 0;
}

T2 fesq

  • 模型转化一下,就是一个排列组合的经典问题(括号序列)
  • 把每一个 +1 转化成一个 1,0 向量, 1 转化为一个 0,1 向量,那么问题就转化为求不经过 y=x 以上的点到达 n,m 的路径数目,最后再除以一个路径总数
    ans=Cmn+mCm1n+mCmn+m=1mn+1

    然后 O(1) 回答就好
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
//  freopen("fseq.in","r",stdin);
//  freopen("fseq.out","w",stdout);
    int T;
    scanf("%d",&T);
    while(T--){
        int n,m;
        scanf("%d%d",&n,&m);
        if(m>n)puts("0.000000");
        else printf("%.6f\n",(n-m+1.0)/(n+1));
    }
    return 0;
}

T3 lucky

数位DP或者暴力容斥,比较麻烦(雾)
待更TAT
考的比较惨烈啊

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值