寒假Day2

寒假Day2

上午考试
三道题 300得80分
第一题空间开小挂到60分
剩下的两题基本瞎打。
我的二分答案实在是非常垃圾。

一、二分答案
对于一些问题,它的解满足单调性,即如果x满足条件,则对于任意的 i ( 1<=i<=x) 或 (x <=i <=n) (假设1和n是答案的上下界)都会满足条件。
使最大……最小、……至少是多少、求出最少的……。
一步一步地缩小答案范围最终出解。
1.数的简单划分
二分答案+贪心
二分答案到最后一个满足该最大值的最小数(check检验能否满足分成k段)
2.跳石头
跟数的简单划分原理一样
3.皇帝的烦恼
这个check比较迷
因为是环形的一个颜色圈,我们可以用两个数组记录
M[i]记录i位置与第一个比较最多有多少个和第一个所有颜色不同
N[i]记录i位置与第一个比较最多有多少个和第一个所有颜色不同

M[1]=N[1]=a[1];
for(int i=2;i<=n;i++){
    N[i]=min(a[i],a[1]-M[i-1]);  
    M[i]=max(0,a[1]+a[i]+a[i-1]-N[i-1]-x); 
}

那么我们只要看最后一个和第一个颜色相同的是不是0了
二、动态规划
1.消失之物

Description
ftiasch 有 N 个物品, 体积分别是 W1, W2, …, WN。 由于她的疏忽, 第 i 个物品丢失了。 “要使用剩下的 N – 1 物品装满容积为 x 的背包,有几种方法呢?” — 这是经典的问题了。她把答案记为 Count(i, x) ,想要得到所有1 <= i <= N, 1 <= x <= M的 Count(i, x) 表格。

for(int i=1;i<=n;i++){
        c[i][0]=1;
        for(int j=1;j<=m;j++){
            if(j>=w[i]) c[i][j]=(f[j]-c[i][j-w[i]]+10)%10;
            else c[i][j]=f[j];
            cout<<c[i][j];
        }
        cout<<endl;
}

这道题就是先用一个一维的f数组记录i体积时的方案数
c[i][j]就是当i物品不选时填满容积为j时的最小方案数
所以对于c[i][j]就有两种讨论的情况
如果当前的体积不够容纳下w[i]就直接等于f所统计的方案数
如果够容纳的下w[i]那么就需要其中使用第i个物品填满j的空间的方案数等于使用其余物品填满j-w(i)的空间的方案数
2.音量调节
水题

F[0][Bl]=1;
    for(int i=1;i<=n;i++)
        for(int j=0;j<=Ml;j++){
            if(j+c[i]<=Ml){
                if(F[i-1][j+c[i]])
                    F[i][j]=1;
            }
            if(j-c[i]>=0){
                if(F[i-1][j-c[i]])
                    F[i][j]=1;
             }
        }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值