A-三元组
原题连接
签到题
每组给三个数,求有多少组的值大于等于2
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n;
std::cin >> n;
int res = 0;
for (int i = 0; i < n; i ++) {
int a,b,c;
std::cin >> a >> b >> c;
res += (a + b + c >= 2);
}
std::cout << res << "\n";
return 0;
}
B-等差数列
原题连接
题解
要满足第i项与第i+1项相差为k,我们可以从头枚举每一个数,把它当做一个不变的值,那么它左边的数就要依次的减去k,才能满足题目要求。同理,右边的数要依次加k。然后判断每个位置是否与我们假设的每位上的数相同,如果不同,则修改。当然,首先要找出修改次数最少的不变值a[i];
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n,m;
std::cin >> n >> m;
std::vector<int> a(n + 1);
for (int i = 1; i <= n; i ++) {
std::cin >> a[i];
}
int res = n;
auto work = [&](int k,bool flag) {
int res = 0;
for (int i = 1; i <= n; i ++) {
int b = a[k] + (i - k) * m;
if (b <= 0) return n;//题目要求是正整数,所以为负数的话我们就不选择这个方案
if (b != a[i]) {
res ++;
if (flag) {
if (b > a[i]) std::cout << "+ " << i << " " << b - a[i] << "\n";
else std::cout << "- " << i << " " << a[i] - b << "\n";
}
}
}
return res;
};
for (int i = 1; i <= n; i ++) {
res = std::min(res,work(i,false));//找出最小的修改次数
}
std::cout << res << "\n";
for (int i = 1; i <= n; i ++) {
if (res == work(i,false)) {
work(i,true);//修改
break;
}
}
return 0;
}
C-卡牌
原题连接
题解
如图,对于第i张卡牌,我们需要对它操作的次数是f(i - 1) + 1 + f(i - 1)。 f为操作次数。所以,我们只需要预处理这样一个f数组,对于每一张蓝底,我们只需要执行1 + f(i - 1)次操作。
#include <bits/stdc++.h>
using namespace std;
using i64 = long long;
int main()
{
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n;
std::cin >> n;
string s;
std::cin >> s;
std::vector<i64> f(n + 1);//由于越往后边数越大,所以需要开longlong
for (int i = 1; i <= n; i ++) {
f[i] = f[i - 1] * 2 + 1;
}
i64 res = 0;
for (int i = 1; i <= n; i ++) {
if (s[i - 1] == 'B') {
res += 1 + f[i - 1];
}
}
std::cout << res << "\n";
return 0;
}