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

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 ;
	}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值