简单算法: 枚举算法,二分法(二分查找,二分答案),快速排序,时空复杂度 高精度处理,快速幂,差分数组,前缀和数组 数据结构:栈,队列,链表,集合,优先队列,字典,可变数组,树,堆,图以及他们的算法 贪心算法 动态规划 A、B、C、D、E、X 互不相同的六个1位数 满足条件ABCDE*X=EDCBA,求各个数字 for(int a=0;a<10;a++){ for(int b=0;b<10;b++){ for(int c=0;c<10;c++){ for(int d=0;d<10;d++){ for(int e=0;e<10;e++){ for(int x=0;x<10;x++){ if(abcdex互不相同){ if((a*10000+b*1000+c*100+d*10+e)*x==(a*10000+b*1000+c*100+d*10+e)){ cout<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e<<" "<<x; } } }}}}}} 枚举算法: 1、列出所有可能性 2、通过条件筛出正确答案 又叫做暴力搜索 限制:1、列不出所有可能性,超时或者其他情况,2、条件不会写 作业:1965,1415 二分法 猜数字案例 #include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main(){ srand(time(0)); int a=rand()%100+1;//1~100 int x=0; for(int i=1;i<=100;i++){ if(i!=a){ x++; } else{ cout<<i<<" "<<x<<" "<<a; break; } } return 0; } 二分法猜数字 #include <iostream> #include <cstdlib> #include <ctime> using namespace std; int main(){ srand(time(0)); int a=rand()%100+1;//1~100 int x=0; int l=1,r=100,mid; while(l<r){ mid=(l+r)/2; if(mid==a) break; else if(mid>a) r=mid-1; else if(mid<a) l=mid+1; } if(l!=r) cout<<mid; else cout<<"NO"; return 0; } 二分法前提:数据答案的范围是有序 二分法流程: 1、找到数据的左右两端 2、只要答案范围内有多个数据,就找中点(分别判断 < = > 或 <= > 或 < >= 三种情况) 1240不是作业 int n,m; int a[100050],b,ans; int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; cin>>m; while(m--){ cin>>b; 各种算 cout<<ans<<endl; } } int n,m; int a[100050],b[100050],ans; int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; cin>>m; for(int i=1;i<=m;i++) cin>>b[i]; for(int i=1;i<=m;i++){ b[i]; 各种算 cout<<ans<<endl; } } |