寒假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;
}
}