股票买卖
算法关于二元一次方程的求解
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 ...
拍照和删减
算法拍照
bi=ai+ai+1可以推出bi+1 - bi = ai+2 - ai,但是这个公式推导只能计算出奇数个数的序列,仔细观察就可以发现枚举第一个数,从1~n枚举就可以枚举所有情况,并不需要考虑字典序排列,因为从小到大枚举并且每个数都是唯一的,所以一定是字典序最小序列。
判断条件的时候考虑:①他已经枚举过了②他是个负数。
拍照II
最优解:①已经处于正确位置的奶牛不要动;②如果奶牛要移动,先移动和后移动的结果是一样的;③从前往后将位置对齐,所以一旦移到正确的位置就不要管了,置0即可。
1234567891011121314151617for(int i = 1; i <= n; i ++) { cin >> a[i]; p[a[i]] = i; } for(int i = 1; i <= n; i ++) cin >> b[i]; int res = 0; //j是代表正确位置序列的下标,向j看齐 for(int i = 1, j = 1; j <= ...