小球
#include <cstdio>
#include <cstring>
const int MAXN = 25;
int d, i;
int s[1 << MAXN];
int main() {
memset(s, 0, sizeof(s));
scanf("%d %d", &d, &i);
int k, n = (1 << d) - 1;
for(int j = 1;j <= i;j ++) {
k = 1;
while(1) {
s[k] = !s[k];
k = s[k] ? k * 2 : k * 2 + 1;
if(k > n) break;
}
}
printf("%d", k / 2);
return 0;
}
找树根和孩子
#include <cstdio>
#include <iostream>
using namespace std;
int n, m, tree[105] = {0};
int x, y, root, maxroot, sum = 0, j, Max = 0;
int main() {
scanf("%d %d", &n, &m);
for(int i = 1;i <= m;i ++) {
scanf("%d %d", &x, &y);
tree[y] = x;
}
for(int i = 1;i <= n;i ++) {
if(tree[i] == 0) {
root = i;
break;
}
}
for(int i = 1;i <= n;i ++) {
sum = 0;
for(int j = 1;j <= n;j ++) {
if(tree[j] == i) sum ++;
}
if(sum > Max) {
Max = sum;
maxroot = i;
}
}
printf("%d
%d
", root, maxroot);
for(int i = 1;i <= n;i ++)
if(tree[i] == maxroot) printf("%d ",i);
return 0;
}
单词查找树
#include <cstdio>
#include <iostream>
#include <cstring>
using namespace std;
int n, t, k;
string a[8005];
string s;
int main() {
while(cin >> a[++ n]);
n --;
for(int i = 1;i < n;i ++) {
for(int j = i + 1;j <= n;j ++) {
if(a[j] > a[i]) {
s = a[i];
a[i] = a[j];
a[j] = s;
}
}
}
t = a[1].length();
for(int i = 2;i <= n;i ++) {
int j = 0;
while(a[i][j] == a[i - 1][j] && j < a[i - 1].length()) j ++;
t += a[i].length() - j;
}
printf("%d", t + 1);
return 0;
}
医院设置
#include <bits/stdc++.h>
using namespace std;
int main() {
int n, l, r;
int a[105][105], b[105];
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++) a[i][j] = 999999999;
for (int i = 1; i <= n; i++) {
a[i][i] = 0;
cin >> b[i] >> l >> r;
if (l > 0)
a[i][l] = a[l][i] = 1;
if (r > 0)
a[i][r] = a[r][i] = 1;
}
for (int k = 1; k <= n; k++)
for (int i = 1; i <= n; i++)
if (i != k)
for (int j = 1; j <= n; j++)
if (j != i && j != k && a[i][k] + a[k][j] < a[i][j])
a[i][j] = a[i][k] + a[k][j];
int minn = 999999999;
for (int i = 1; i <= n; i++) {
int sum = 0;
for (int j = 1; j <= n; j++) sum += a[i][j] * b[j];
if (sum < minn)
minn = sum;
}
cout << minn << endl;
return 0;
}