A
题意: 把n个硬币分成几部分, 某些部分的和能组成1~n范围内的所有整数
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
#include <unistd.h>
#include <unordered_map>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
const int qq = 1e5 + 10;
const int INF = 1e9 + 10;
const int MOD = 1e9 + 7;
int main() {
int n; scanf("%d", &n);
int bin = 1;
int ans = 0;
while (n - bin > 0) {
ans++;
n -= bin;
bin <<= 1;
}
if (n > 0) ans++;
printf("%d\n", ans);
return 0;
}
B
题意: 只有一种操作对某个元素进行加1或者减1, 最后让数组的中位数是s, 求最少操作数
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
#include <unistd.h>
#include <unordered_map>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
const int qq = 2e5 + 10;
const int INF = 1e9 + 10;
const int MOD = 1e9 + 7;
int n, m;
int num[qq];
int a[qq], b[qq];
int main() {
scanf("%d%d", &n, &m);
for (int i = 0; i < n; ++i) {
scanf("%d", num + i);
}
sort(num, num + n);
int big = 0;
for (int i = 0; i < n; ++i) {
if (num[i] >= m) a[big++] = num[i];
}
int small = 0;
for (int i = n - 1; i >= 0; --i) {
if (num[i] < m) b[small++] = num[i];
}
LL ans = 0;
if (big > small) {
int cnt = 0;
while (small + cnt < (n + 1) / 2) {
ans += a[cnt++] - m;
}
} else {
int cnt = 0;
while (big + cnt < (n + 1) / 2) {
ans += m - b[cnt++];
}
}
printf("%lld\n", ans);
return 0;
}
C
题意: 两种操作第一种操作是将一个0变成1或者1变成0 代价是1, 或者将两个位置上的数字进行交换, 代价是|i - j|. 现在让你将a串变为b串, 求最小代价.
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
#include <unistd.h>
#include <unordered_map>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
const int qq = 1e6 + 10;
const int INF = 1e9 + 10;
const int MOD = 1e9 + 7;
int n;
string x, y;
int dp[qq];
int main() {
cin >> n;
cin >> x >> y;
dp[0] = 0;
for (int i = 1; i <= n; ++i) {
if (x[i - 1] == y[i - 1]) {
dp[i] = dp[i - 1];
} else {
dp[i] = dp[i - 1] + 1;
if (i > 1 && x[i - 1] == y[i - 2] && x[i - 2] == y[i - 1]) {
dp[i] = min(dp[i], dp[i - 2] + 1);
}
}
}
cout << dp[n] << endl;
return 0;
}
D
题意: 给出一棵树, 然后给出一个bfs的访问序列, 问这个序列是否合法
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <iostream>
#include <algorithm>
#include <sstream>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <utility>
#include <bitset>
#include <unistd.h>
#include <unordered_map>
using namespace std;
#define LL long long
#define pb push_back
#define mk make_pair
#define pill pair<int, int>
#define mst(a, b) memset(a, b, sizeof a)
#define lson (rt << 1)
#define rson ((rt << 1) | 1)
const int qq = 2e5 + 10;
const int INF = 1e9 + 10;
const int MOD = 1e9 + 7;
int dep[qq], pre[qq], n;
vector<int> vt[qq];
void dfs(int u, int fa) {
pre[u] = fa;
dep[u] = dep[fa] + 1;
int sz = vt[u].size();
for (int i = 0; i < sz; ++i) {
int v = vt[u][i];
if (v == fa) continue;
dfs(v, u);
}
}
int path[qq];
vector<int> nodeDep[qq];
int main() {
scanf("%d", &n);
for (int i = 1, a, b; i < n; ++i) {
scanf("%d%d", &a, &b);
vt[a].pb(b), vt[b].pb(a);
}
dfs(1, 0);
for (int i = 1; i <= n; ++i) {
sort(vt[i].begin(), vt[i].end());
}
bool f = true;
int pre = 0;
for (int i = 0; i < n; ++i) {
scanf("%d", path + i);
nodeDep[dep[path[i]]].pb(path[i]);
int flag = dep[path[i]] - pre;
pre = dep[path[i]];
if (flag < 0 || flag > 1) f = false;
}
if (path[0] != 1 || !f) {
puts("No");
return 0;
}
for (int i = 1; i <= n && f; ++i) {
if (nodeDep[i].size() == 0) continue;
int start = 0;
for (int j = 0; j < nodeDep[i].size() && f; ++j) {
int u = nodeDep[i][j];
int sz = vt[u].size();
if (u != 1) sz--;
for (int k = 0; k < sz && f; ++k) {
int v = nodeDep[i + 1][start];
int id = lower_bound(vt[u].begin(), vt[u].end(), v) - vt[u].begin();
start++;
if (vt[u][id] != v) f = false;
}
}
}
puts(f ? "Yes" : "No");
return 0;
}