新生练习3

1:自然数拆分
查看 提交 统计 提问
总时间限制: 10000ms 单个测试点时间限制: 1000ms 内存限制: 65536kB
描述
对于任意大于1的自然数n,总是可以拆分成若干个小于n的自然数之和。现请你编写程序求出n的所有拆分。

输入
输入文件共一行,包含一个自然数,即要拆分的自然数n(1≤n≤20)。
输出
输出文件有若干行,每行包含一个等式,即代表一种可行的拆分(格式与顺序参见样例)。
样例输入
5
样例输出
5=1+1+1+1+1
5=1+1+1+2
5=1+1+3
5=1+2+2
5=1+4
5=2+3

Dfs没什么难度。

#include<iostream>
#include<cstdio>
using namespace std;
int a;
char str[100];
void Dfs(int j, int n, int cnt) {
    if (n == a) {
        str[cnt - 1] = '\0';
        printf("%d%s\n", a, str);
        return;
    }
    for (int i = j; i < a; i++) {
        if (n + i > a) {
            return;
        }
        int k = 0, in = i;
        while (in) {
            in /= 10;
            k++;
        }
        int kn = k;
        in = i;
        while (kn--) {
            str[cnt + kn] = '0' + in % 10;
            in /= 10;
        }
        str[cnt + k] = '+';
        Dfs(i, n + i, cnt + k + 1);
    }
}
int main() {
    while (cin >> a) {
        str[0] = '=';
        Dfs(1, 0, 1);
    }
}

传教士
查看 提交 统计 提问
总时间限制: 1000ms 内存限制: 65536kB
描述
某王国的疆土恰好是一个矩形,为了管理方便,国王将整个疆土划分成n×m块大小相同的区域。由于国王非常信教,因此他希望他的子民也能信教爱教,所以他想安排一些传教士到全国各地去传教。但这些传教士的传教形式非常怪异,他们只在自己据点周围特定的区域内传教且领地意识极其强烈(即任意一个传教士的据点都不能在其他传教士的传教区域内,否则就会发生冲突)。现在我们知道传教士的传教区域为以其据点为中心的两条斜对角线上(如图)。现在国王请你帮忙找出一个合理的安置方案,使得可以在全国范围内安置尽可能多的传教士而又不至于任意两个传教士会发出冲突。

(若A为某传教士的据点,则其传教范围为所有标有x的格子。为不产生冲突,则第二个传教士的据点只能放在上图的空格子中。)

输入
输入文件共一行,包含两个正整数n和m(1≤n,m≤20),代表国土的大小,n为水平区域数,m为垂直区域数。
输出
输出文件仅一行,包含一个正整数,即最多可以安置的传教士的数目。
样例输入
3 4
样例输出
6
提示
样例安置方案如下图所示,X表示为某传教士的据点。
X X X
O O O
O O O
X X X

先DFS找规律之后就直接解出答案。

#include<iostream>
#include  <cstdio>
using namespace std;
int x[405];
int y[405];
int n, m, ans, maxn;
int abs(int n) {
    if (n < 0) {
        return -n;
    }
    else {
        return n;
    }
}
bool ok(int xn, int yn) {
    for (int i = 0; i < ans; i++) {
        if (abs(xn - x[i]) == abs(yn - y[i])) {
            return false;
        }
    }
    return true;
}
void Dfs() {
    if (maxn < ans) {
        maxn = ans;
    }
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            if (ok(i, j)) {
                x[ans] = i;
                y[ans++] = j;
                Dfs();
                ans--;
            }
        }
    }
}
int main() {
    while (cin >> n >> m) {
        ans = 0;
        maxn = 0;
        Dfs();
        printf("%d\n", maxn);
    }
}
#include<iostream>
#include  <cstdio>
using namespace std;
int main() {
    int m, n;
    while (cin >> m >> n) {
        if (m > n) {
            int t = m;
            m = n;
            n = t;
        }
        if (m == 1 && n == 1) {
            printf("1\n");
            continue;
        }
        if (m == n) {
            printf("%d\n", m + n - 2);
            continue;
        }
        if (m % 2) {
            printf("%d\n", m + n - 1);
            continue;
        }
        else {
            if (n % 2) {
                n++;
            }
            printf("%d\n", m + n - 2);
            continue;
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/lxworld123/article/details/51868232