背包和最长上升子序列
算法分组背包
f[i][j]表示的是前i组物品,总体积不大于j的集合(所有选法)(最大值)。
①不选第i组物品;②选第i组的某个物品。
1234567891011121314151617181920212223242526272829#include<iostream>using namespace std;const int N = 110;int n, m;int v[N][N], w[N][N], s[N];int f[N][N];int main() { cin >> n >> m; for(int i = 1; i <= n; i ++) { cin >> s[i]; for(int j = 1; j <= s[i]; j ++) cin >> v[i][j] >> w[i][j]; } for(int i = 1; i <= n; i ++) for(int ...
股票买卖
算法关于二元一次方程的求解
ax + by = f, a + b = h; a, b是两个未知数,求解a, b的值。题目保证有整数解 。
可以先求出一个未知数b的值,可以推出b = (f - hx) / (y - x),在判断a + b == h ?
股票买卖I(简单贪心)12345678910111213141516171819#include<iostream>using namespace std;int main() { int n; cin >> n; int temp = 0x3f3f3f3f; int ans = 0; while(n --) { int x; cin >> x; ans = max(ans, x - temp); temp = min(temp, x); } cout << ans << endl; return 0;}
股票买卖 ...
里程表
算法里程表
因为100~1e16中有趣的数总共也只有两万多。所以枚举每个数,看哪些数在给定的范围之间。
string str(5, '1'); string的初始化
stoll()此函数将在函数调用中作为参数提供的字符串转换为long long 。它解析str并将其内容解释为指定基数的整数,并将其作为long long 类型的值返回。
用法:
1long long int stoll (const string& str, size_t* idx = 0, int base = 10)
该函数接受三个参数,如下所述:
**str:**此参数使用整数表示指定String对象。
**idx:**此参数指定指向size_t类型的对象的指针,该对象的值由函数设置为数值后str中下一个字符的位置。此参数也可以是空指针,在这种情况下,将不使用该参数。
**base:**此参数指定“数字基数”,以确定用于解释字符的数字系统。如果基数为0,则它使用的基数由序列中的格式确定。默认基数为10。
stoi()此函数将在函数调用中作为参数提供的字符串转换为int。还有s ...
并查集和密码锁
算法见面与问候
如果两个点从原点开始,都是以1个单位距离/1个单位时间在坐标轴上运动,那么这两个点要么是在某个坐标相遇,要么相差一个点快要相遇,不可能在两个坐标之间相遇。
scanf("%d %c", &x, &op);,scanf会读入空格
外层循环为1e5,内层最多循环1e6,内层循环决定了时间复杂度,总共是$O(1e6)$
注意:如果时间刚停止时,两头奶牛刚好碰见,那么时间停止后也会碰见一起 ,遍历要加入判断是否为时间停止后的情况。
镜子
①写dx[],dy[]的时候,注意题目中给的坐标系是怎么建立的,x,y轴向上还是向下。
②当上下左右四个方向分别用0,1,2,3来表示,注意他们方向之间的变换规则。如0和1,2和3可以用将方向^1就可以得到更改后的方向。
③当坐标的移动不是一个单位的时候,可以用向量乘以一个模 。
④char op; op = '\\', ‘\‘是转义字符~
123456789101112131415161718192021222324252627282930313233343536373 ...



