小球

#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\n%d\n", 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;
}