算法
拍照

bi=ai+ai+1可以推出bi+1 - bi = ai+2 - ai,但是这个公式推导只能计算出奇数个数的序列,仔细观察就可以发现枚举第一个数,从1~n枚举就可以枚举所有情况,并不需要考虑字典序排列,因为从小到大枚举并且每个数都是唯一的,所以一定是字典序最小序列。

判断条件的时候考虑:①他已经枚举过了②他是个负数。

拍照II

最优解:①已经处于正确位置的奶牛不要动;②如果奶牛要移动,先移动和后移动的结果是一样的;③从前往后将位置对齐,所以一旦移到正确的位置就不要管了,置0即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
for(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 <= n; j ++) {
while(!a[i]) i ++;
if(a[i] == b[j]) i ++;
else {
int k = p[b[j]];
a[k] = 0;
res ++;
}
}
礼物

暴力+排序+枚举~

折叠绳子

0.5一个单位枚举~

reverse()函数

reverse(s.begin(),s.end()); 字符串翻转函数

如前

倍数17N

将一个数乘以17可以看成是将二进制左移四位再加上本身。

考虑只有一个零的时候的特殊情况~

高精度加法~

一排奶牛

注意:如果最长连续的奶牛在最后,则还要考虑将答案与此结果max一下,因为答案只在for循环中的一种条件得出,所以最后max保证答案是所有情况下的最大值。

删减

kmp时间复杂度是$O(2n)$~

从前往后删,超时,reverse(i, len);从后往前删,reverse(te.begin() + te.size() - t.size(), te.end())过~

从前往后删,会带来大量字符的移动,从后往前删不会~~

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include<iostream>
#include<cstring>
#include<algorithm>

using namespace std;

const int N = 1000010;

int main() {
string s, t;
string te;

cin >> s >> t;

for(int i = 0; i < s.size(); i ++) {
te += s[i];
if(te.size() >= t.size() && te.substr(te.size() - t.size(), t.size()) == t) {
te.erase(te.begin() + te.size() - t.size(), te.end());
}
}
cout << te << endl;
return 0;
}
牟加密
找到牛