A
暴力
#include <bits/stdc++.h>
using namespace std;
int T, a, b;
int main() {
cin >> T;
while (T -- ) {
int n;
cin >> n;
vector<int> v;
while (n) {
v.push_back(n % 10);
n /= 10;
}
reverse(v.begin(), v.end());
int minn = 0x3f3f3f3f;
int res;
for (int i = 1; i <= 999; i ++ ) {
if (i % 7 == 0) {
int j = i;
vector<int> ans;
while (j) {
ans.push_back(j % 10);
j /= 10;
}
reverse(ans.begin(), ans.end());
if (ans.size() != v.size()) continue;
else {
int sum = 0;
for (int i = 0; i < v.size() ; i ++ )
if (v[i] != ans[i])
sum ++;
if (minn > sum) {
res = i;
minn = sum;
}
}
}
}
cout << res << endl;
}
return 0;
}
B
简单思维
#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int T;
char s[N];
int main() {
cin >> T;
while (T -- ) {
cin >> s + 1;
int n = strlen(s + 1);
int sum0 = 0, sum1 = 0;
for (int i = 1; i <= n; i ++ ) {
if (s[i] == '0') sum0 ++;
else sum1 ++;
}
if (sum0 == sum1) cout << sum0 - 1 << endl;
else cout << min(sum0, sum1) << endl;
}
return 0;
}
C
暴力
#include <bits/stdc++.h>
#define int long long
using namespace std;
int T, hc, dc, hm, dm;
int k, w, a;
bool check(int b, int a)
{
int t = hm / a + (hm % a == 0 ? 0 : 1);
t --;
if (b > dm * t) return true;
else return false;
}
signed main() {
cin >> T;
while (T -- ) {
cin >> hc >> dc;
cin >> hm >> dm;
cin >> k >> w >> a;
bool flag = 0;
for (int i = 0; i <= k; i ++ ) {
int _hc = i * a + hc;
int _dc = (k - i) * w + dc;
if (check(_hc, _dc)) {
flag = 1;
break;
}
}
if (flag) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
D
发现最多的步骤不超过12次,所以可以直接01背包
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int T, n, k;
int a[N], b[N], c[N], f[1000010];
int main() {
cin >> T;
while (T -- ) {
cin >> n >> k;
for (int i = 1; i <= n; i ++ ) cin >> b[i];
for (int i = 1; i <= n; i ++ ) cin >> c[i];
function<void()> bfs = [&]() {
queue<int> q;
q.push(1);
unordered_map<int, int> st, d;
st[1] = 1;
d[1] = 0;
while (q.size()) {
auto t = q.front();
q.pop();
for (int i = 1; i <= t; i ++ ) {
if (!st.count(t + t / i) && t + t / i <= 1000) {
st[t + t / i] = 1;
d[t + t / i] = d[t] + 1;
q.push(t + t / i);
}
}
}
for (int i = 1; i <= n; i ++ )
a[i] = d[b[i]];
};
bfs();
int maxx = min(12 * n, k);
for (int i = 0; i <= maxx; i ++ ) f[i] = 0;
for (int i = 1; i <= n; i ++ )
for (int j = maxx; j >= a[i]; j -- )
f[j] = max(f[j], f[j - a[i]] + c[i]);
cout << f[maxx] << endl;
}
return 0;
}