這裏發一些基本的模版,就這樣~函數
1. 0-1揹包ui
int bag_01() { //01揹包 for(int i = 1; i <= n; i++) for(int j = c; j >= w[i]; j--) f[j] = max(f[j], f[j-w[i]]+v[i]); return f[c]; } //對於徹底揹包(物品不限):將第二個循環的順序反向便可。
2. 二分查找spa
//這是找最大 int Binary_Search(int Left, int Right) { while(Left <= Right) { int Mid = (Left + Right) / 2; if(check(Mid)) Left = Mid + 1; else Right = Mid - 1; } return Left - 1; } //這是找最小 int Binary_Search(int Left, int Right) { while(Left <= Right) { int Mid = (Left + Right) / 2; if(check(Mid)) Right = Mid - 1; else Left = Mid + 1; } return Right + 1; }
3. 計算n的因子個數code
int calc(int n){ //calc(n) : 計算n的因子個數 int ans=1, t; for (int i=2; i*i<=n; i++){ for (t=0; n%i==0; n/=i) t++; ans*=t+1; } if (n>1) ans*=2; return ans; }
4. 最大公約數blog
int gcd(int a, int b) { return b ? gcd(b, a%b) : a; } //gcd函數返回a和b的最大公約數(a>b) 最小公倍數=a*b/gcd(a,b)
5. 最長公共子序列get
int LCS() { for(int i = 1; i <= xl; i++) for(int j = 1; j <= yl; j++) if(x[i] == y[j]) f[i%2][j] = f[(i-1)%2][j-1]+1; else f[i%2][j]=max(f[(i-1)%2][j],f[i%2][j-1]); return f[xl%2][yl]; }
6. 篩法求素數class
void prime(int n) { //篩法求素數表 for(int i = 2; i <= sqrt(n); i++) if(!p[i]) for(int j = i+i; j <= n; j += i) p[j] = 1; } //p[i]=0:該數是素數;p[i]=1:該數不是素數
7. 快速冪循環
int quickpow(int a, int b, int m){ //快速冪 求a^b%m的值 int t=1; while (b){ if (b&1) t=t*a%m; b>>=1; a=a*a%m; } return t; }
8. 快速讀入整數gc
inline void read(int& x){ char c=getchar(); int f=1,num=0; for(;c<'0'||c>'9';c=getchar()) if(c=='-')f=-1; for(;c>='0'&&c<='9';c=getchar()) num=num*10+c-'0'; x=num*f; }
這些都是最基本的模版哦!若是有什麼其餘的有用的模版歡迎在評論區中提出哦!im