2022.3.6 14:55
欧几里得算法(求最大公约数)
int gcd(int a , int b)
{
if(b == 0 ) return a;
else gcd(b , a % b);
}
https://zhuanlan.zhihu.com/p/259706781
2022.3.11 20:06
用set,map
不要用ordered_set或者ordered_map 会被卡数据。而且没有对pair类型的哈希映射,set,map都有
set.find 返回的是一个迭代器 ,和指针有同样的接口,可以当指针用。
cout >> 不是什么都能输出
2022.3.12 11:44
判断区间时,把满足条件的临界位置想出来,写成条件即可。
d区间里的左闭右开,可以为第一个区间点为t,最后一个为t+d-1,则这个区间的左端点的前一个点为t-1
如双指针第一题1238
左闭右开 ,这个区间内一共右d个元素,而在这个区间左外的元素为右端点减区间外元素等于d
2022.4.3
int main()
{
//2. 创建流
ofstream output;
//3. 打开文件,将流与文件相关联,这里使用相对路径
output.open("number.txt");
//4. 向文件写入数据
output << 1 << " " << 2 << " " << 3 << endl;
//5. 关闭流
output.close();
return 0;
}
2022.4.7
STL提供了两个用来计算排列组合关系的算法,分别是next_permutation和prev_permutation。首先我们必须了解什么是“下一个”排列组合,什么是“前一个”排列组合。考虑三个字符所组成的序列{a,b,c}。
这个序列有六个可能的排列组合:abc,acb,bac,bca,cab,cba。这些排列组合根据less-than操作符做字典顺序(lexicographical)的排序。也就是说,abc名列第一,因为每一个元素都小于其后的元素。acb是次一个排列组合,因为它是固定了a(序列内最小元素)之后所做的新组合。
同样道理,那些固定b(序列中次小元素)而做的排列组合,在次序上将先于那些固定c而做的排列组合。以bac和bca为例,bac在bca之前,因为次序ac小于序列ca。面对bca,我们可以说其前一个排列组合是bac,而其后一个排列组合是cab。序列abc没有“前一个”排列组合,cba没有“后一个”排列组合。 next_permutation()会取得[first,last)所标示之序列的下一个排列组合,如果没有下一个排列组合,便返回false;否则返回true。这个算法有两个版本。其中常用的版本使用元素型别所提供的less-than操作符来决定下一个排列组合。
用next_permutation()之前要先sort一下
#include <iostream>
#include<algorithm>
using namespace std;
int main(int argc, char** argv) {
int a[4]={1,2,3,4};
sort(a,a+4);
do{
//cout<<a[0]<<" "<<a[1]<<" "<<a[2]<<" "<<a[3]<<endl;
for(int i=0;i<4;i++)
cout<<a[i]<<" ";
cout<<endl;
}while(next_permutation(a,a+4));
return 0;
}
2022.4.8
.memset函数详细说明
1)void memset(void s,int c,size_t n) 总的作用:将已开辟内存空间 s 的首 n 个字节的值设为值 c。
2).memset() 函数常用于内存空间初始化。如:
char str[100];
memset(str,0,100);
2022.4.9
dfs的时候如果遇到不合法情况应该return ,而不是判断合法情况进行操作就行
#include <bits/stdc++.h>
using namespace std;
int n , m ;
long long ans;
void dfs(int x , int w ,int u ,int v)
{
if(x == n + m ) return;//到第 n+m 位时返回(最后一位必须是花位,所以最后一位不枚举)
if(u ) dfs(x + 1 , 2 * w , u-1 ,v);//当店还有机会遇到时,遇店
if(v && w > 0) dfs(x + 1 , w - 1 , u ,v-1);//当花还有机会遇到并且李白还有酒时,遇花
if(w == 1 && x == n + m -1) ans = (ans + 1)% 1000000007;//当最后还有一斗酒时,则满足条件(因为最后一位必须是花,
//所以最后只要还有一斗酒就满足条件
}
int main()
{
cin >> n >> m;
//传入当前的枚举的位置,当前剩余酒,剩余可以遇到的店的次数,剩余可以遇到花的次数- 1,因为最后一次一定是花
dfs(1 ,2 ,n ,m - 1);
cout << ans ;
return 0;
}
这道题错在
if(w == 1 && x == n + m -1) ans = (ans + 1)% 1000000007;
这里的x是当前的的位置,当前的x还没有进行操作,所以应该在w == 1 && x == n + m 进行ans加1
这才是计算前面 n+m-1 个位置遇到的店或者花造成的影响
可以把初始条件设为x = 0就是对的