oj模板库(慢慢存储,主要是刚刚开始学习oj。发现身边好多人都有一个很好的模板库)

来源:互联网 发布:淘宝商家限制上线数 编辑:程序博客网 时间:2024/06/05 14:20

Fibonacci的快速幂求法时间是O(lgn)

#include<iostream>#include<cmath>using namespace std;typedef unsigned long long int LINT;//函数 Fibonacci采用快速的幂的方法可以实现快速的 Fibonacci避免了相应的计算;//其中f0和f1是初始的条件//n代表的是所要求的fn的下标 int Fibonacci(LINT f0,LINT f1,LINT n){LINT fn;int n_bi=ceil(log(n+1)/log(2));LINT *array_n_bi=new LINT[n_bi]();for( int i=0;i<n_bi;++i) {array_n_bi[i]=n%2;    n/=2;}   LINT** matrix=new LINT*[n_bi];for( int i=0;i<n_bi;++i)  matrix [i]=new LINT[4](); matrix[0][0]=0;matrix[0][1]=1;matrix[0][2]=1;matrix[0][3]=1; for( int i=1;i<n_bi;++i) { matrix[i][0]=(matrix[i-1][0]*matrix[i-1][0]+matrix[i-1][1]*matrix[i-1][2]); matrix[i][1]=(matrix[i-1][0]*matrix[i-1][1]+matrix[i-1][1]*matrix[i-1][3]); matrix[i][2]=(matrix[i-1][2]*matrix[i-1][0]+matrix[i-1][3]*matrix[i-1][2]); matrix[i][3]=(matrix[i-1][2]*matrix[i-1][1]+matrix[i-1][3]*matrix[i-1][3]); }LINT m11=1;LINT m12=0;LINT m21=0;LINT m22=1;LINT temp_m11=1;LINT temp_m12=0;LINT temp_m21=0;LINT temp_m22=1;  for( int i=0;i<n_bi;++i) { if(array_n_bi[i]==1) { m11=(temp_m11*matrix[i][0]+temp_m12*matrix[i][2]); m12=(temp_m11*matrix[i][1]+temp_m12*matrix[i][3]); m21=(temp_m21*matrix[i][0]+temp_m22*matrix[i][2]); m22=(temp_m21*matrix[i][1]+temp_m22*matrix[i][3]); temp_m11=m11; temp_m12=m12; temp_m21=m21; temp_m22=m22; } } fn=(m11*f0+m21*f1); cout<<fn<<endl; return fn;}int main(){unsigned long long int n;cin>>n;if(n<3)cout<<n<<endl; else{int res=Fibonacci(1,1,n);} } 

01背包问题(动态规划)

#include<cstdio>  using namespace std; //函数 knapsack_problem_01中//need代表的是物品需要的空间数组 //value代表的是物品价值数组 //m代表的是背包的最大容量//n代表的是物品的个数 int knapsack_problem_01(int *need,int* value,int m,int n){      int * f=new int[m]();      for(int i=0;i<n;++i)          for(int j=m;j>=need[i];--j)              if(f[j]<f[j-need[i]]+value[i])                  f[j]=f[j-need[i]]+value[i];                  return f[m-1];}int main()  {      int n,m;      scanf("%d%d",&n,&m);      int *need=new int[n];      int* value=new int[n];      for(int i=0;i<n;++i)         scanf("%d%d",need+i,value+i);        printf("%d\n",knapsack_problem_01(need,value, m,n));}  

对树以行为单位进行的操作

struct TreeNode {    int val;    TreeNode *left;     TreeNode *right;     TreeNode(int x) : val(x), left(NULL), right(NULL) {} };void  levelOrder(TreeNode* root) {vector<vector<int>> res;if (root == NULL){//TODO///空树的处理}if (root->left == NULL&&root->right == NULL){//TODO//只有一个节点的树的处理}queue<TreeNode *> queue0, queue1;queue0.push(root);TreeNode * pre;int op01 = 0;while (!queue0.empty() || !queue1.empty()){if (op01 == 0){//{////TODO////一行开始前的处理//}while (!queue0.empty()){pre = queue0.front();queue0.pop();//{////TODO//对行中的节点进行的处理//}if (pre->left != NULL)queue1.push(pre->left);if (pre->right != NULL)queue1.push(pre->right);}//{////TODO////一行结束时的处理//}op01 = 1;}else{//{////TODO////一行开始前的处理//}while (!queue1.empty()){pre = queue1.front();queue1.pop();//{////TODO//对行中的节点进行的处理//}if (pre->left != NULL)queue0.push(pre->left);if (pre->right != NULL)queue0.push(pre->right);}//{////TODO////一行结束时的处理//}op01 = 0;}}return ;}



1 0