两题罚坐。最后一题隐隐约约感觉到什么,就是求子序列长度为2的时候想错了…
A. AcWing 3787. 整除
取模
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
int t;
cin >> t;
while(t -- )
{
int a, b;
cin >> a >> b;
int r = a % b;
if(r == 0) puts("0");
else cout << b - r << endl;
}
return 0;
}
B. AcWing 3788. 截断数组
前缀和,O(n)
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 100010;
int n;
int a[N], s[N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ ) cin >> a[i], s[i] = s[i - 1] + a[i];
int res = 0;
for (int i = 1; i < n; i ++ )
{
int l = s[i], r = s[n] - s[i];
if(l == r) res ++;
}
cout << res << endl;
return 0;
}
C. AcWing 3789. 隐藏字符串
/*
思路:递推,分析
等差数列前两个字符就能确定这个子序列(或者模拟样例能感觉出来)
所以符合答案的子序列长度为1或者2
技巧:当从正面想的时候没有思路,可以从符合条件的答案出发想有什么性质(y总经验)
比如这题:符合条件的等差数列 性质:子序列长度为1或2
长度为1 的直接统计单个字符出现的次数
长度为2 的,f[i][j]:表示<i,j>出现的次数,j表示第二个字符,f[~i][j] += cnt[~i] // ~i 表示各自的i
递推即可求解
时间复杂度:O(26*n)
*/
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 100010;
LL cnt[26]; // cnt[] 表示单个字符出现的次数
LL f[26][26]; // f[i][j]: i,j 两个字符配对的数量
int main()
{
string s;
cin >> s;
LL res = 0;
for (int i = 0; i < s.size(); i ++ )
{
int t = s[i] - 'a';
for(int j = 0;j < 26;j ++ )
{
f[j][t] += cnt[j]; // 这里是cnt[j]
res = max(res,f[j][t]);
}
cnt[t] ++;
res = max(res,cnt[t]);
}
cout << res << endl;
return 0;
}