队列是先进先出
![122.png
(9A)
16
=
(2122)
4
=
(232)
8
](https://cdn.acwing.com/media/article/image/2021/08/23/98221_18d2a56603-122.png)
//
栈的性质决定只能是dabc
长度为11的有33个:A、B、C;
长度为22的有55个:AA、AB、BB、BC、CC;
长度为33的有77个:AAA、AAB、ABB、BBB、BBC、BCC、CCC;
长度为44的有66个:AAAB、AABB、ABBB、BBBC、BBCC、BCCC;
长度为55的有55个:AAABB、AABBB、ABBBC、BBBCC、BBCCC;
长度为66的有44个:AAABBB、AABBBC、ABBBCC、BBBCCC;
长度为77的有33个:AAABBBC、AABBBCC、ABBBCCC;
长度为88的有22个:AAABBBCC、AABBBCCC;
长度为99的有11个:AAABBBCCC。
共计36个。
贪心算法。
(x
1
,
y
1
)
,
(
x
2
,
y
2
)
(
x
2
,
y
2
)
的
中
点
是
{(x +x )/2,(y ,y)/2}
1 2 1 2
只有(奇,偶)(奇,奇)(偶,奇)(偶,偶)四种情况.所以,至少要 5个点。
这个程序是在求 nn 的约数有多少个,1818 的约数有 1, 2, 3, 6, 9, 181,2,3,6,9,18。
这个程序是在找一条从(1,1)(1,1)到(n,x)(1\le x\le n)(n,x)(1≤x≤n)开始的和最大的路径,每次只能从(i,j)(i,j) 走到 (i+1,j)(i+1,j)或(i+1,j+1)(i+1,j+1)。
先大致浏览一遍,可以得出,f[i] 应该是第i个点的战斗力大小,ans应该是战斗力最高的点的编号,max_f
是战斗力最高的点的战斗力。所以第一空明显应该是赋初值.第四空,题目中说战斗力相同要取编号大的,所以应该要加等于号。
第 28 题
(排列数)输入两个正整数 n, m (1 \le n \le 20, 1 \le m \le n)n,m(1≤n≤20,1≤m≤n),在 11~nn 中任取 mm 个数,按字典序从小到大输出所有这样的排列。
例如输入:
3 2
输出:
1 2
1 3
2 1
2 3
3 1
3 2
#include<iostream>
#include<cstring>
using namespace std;
const int SIZE = 25;
bool used[SIZE];
int data[SIZE];
int n, m, i, j, k;
bool flag;
int main(){
cin>>n>>m;
memset(used, false, sizeof(used));
for (i = 1; i <= m; i++){
data[i] = i;
used[i] = true;
}
flag = true;
while (flag){
for (i = 1; i <= m-1; i++)cout<<data[i]<<"";
cout << data[m] << endl;
flag =①;
for (i = m; i >= 1; i--){
②;
for (j = data[i]+1; j <= n; j++)
if (!used[j]){
used[j] = true;
data[i] =③;
flag = true;
break;
}
if (flag){
for (k = i+1; k <= m; k++)
for (j = 1; j <=④; j++)
if (!used[j]){
data[k] = j;
used[j] = true;
break;
}
⑤;
}
}
}
}
used[i]==0表示数字i还没有被使用过,每次倒着找到第一个能变大的数字然后变大,接着把后面的数字直接从小到大安排,就生成了一个新的组合。flag是标记能不能找到一个新的排列,第一层的循环意义是把排列中的第 i 位给它清零就是第二个空的作用,如果找到一个排列就把后面的排列补全(在剩余的元素中找到最小的排列)然后跳出循环,就是第四和第五个空的意思。