OI模版合集

快读快写

inline int read() {//快读
	char ch = getchar();
	int x = 0,f = 1;
  	while (!isdigit(ch)) if (ch == '-') f = -1,ch = getchar();
  	while (isdigit(ch)) x = x * 10 + ch - '0',ch = getchar();
  	return x * f;
}

inline void print(int n){//快写
    if(n < 0){
        putchar('-');
        n *= -1;
    }
    if(n > 9) print(n / 10);
    putchar(n % 10 + '0');
}

背包

01背包

二维写法

	cin >> maxw >> n;
	for (int i = 1;i <= n;i++) {
		cin >> w >> v;
		for (int j = 1;j <= maxw;j++) {
			if (w > j) {
				dp[i][j] = dp[i - 1][j];
			} else {
				dp[i][j] = max(dp[i - 1][j],dp[i - 1][j - w] + v);
			}
		}
	}
	cout << dp[n][maxw];

一维写法

	cin >> maxv >> n; // maxv: 价值
	for (int i = 1;i <= n;i++) {
		cin >> v;
		for (int j = maxv;j >= v;j--) {
			dp[j] = max(dp[j],dp[j - v] + v);
		}
	}
	cout << dp[maxv];

完全背包

#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
const int N=1e4+10,S=1e7+10;
ll dp[S],vi,wi,maxw,n;
int main() {
    scanf("%lld%lld", &maxw, &n);
    for (int i=1;i<=n;i++) {
        scanf("%lld%lld",&wi,&vi);
        for (int j = wi;j<=maxw;j++) 
            dp[j] = max(dp[j],dp[j-wi]+vi);
    }
    printf("%lld", dp[maxw]);
    return 0;
}

二分

找最大


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

posted @ 2025-05-28 12:29  Fools_Sparkle  阅读(24)  评论(0)    收藏  举报