枚举
进制类
void d(int h) |
其中3为设置的最高数,不适用>=,会导致结果偏小
且在枚举过程中
for(int i=10;:a[0]==0;)
{
if(cc()==n)copy();
a[i]++;
if(a[i]==4)d[i];
}
用a[0]限制溢出,a[i]++放中间,进位函数放第三位,题目操作放首位。
排列类
因为每位的值最小相差1,所以要考虑从第一个仅进位的项开始重置
int df(int g,int t)
{
if(g>=1)
{
if(b[g]>c[g])
{
b[g-1]++;
t=g;
}
returndf(g-1,t);
}
else return t;
}
int h=df(m,0);
int (h!=0)
{
for(int i=h;i<=m;i++)
{
b[i]=b[i-1]+1;
}
}
返回的t表示发生进位的最大位数,然后在该点后进行重置。
上为进位系统。数组C记录最大的位置,而数组B记录当前的排列。如下:for(int i=1;i<=n;i++)
{
a[i]=i;
}
c[0]=n-m;
for(int i=1;i<=m;i++)
{
b[i]=i;
c[i]=c[i-1]+1;
}
其中数组A记录题目给出范围,使用时a[b[]]即可。
全排列
include<algorithm> |
除此之外,本人的思路为交换数列的最后两位,满二进一,前位满则替换为最小的空余的数,但是需要搜索算法,于是不会了。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hephaestus!