1004. To Buy or Not to Buy - Hard Version (35)解题报告

来源:互联网 发布:淘宝幽默卖家自动回复 编辑:程序博客网 时间:2024/05/24 01:48

DFS+适当剪枝


感谢:

PAT (Top Level) Practise 1004 To Buy or Not to Buy - Hard Version (35)

1004. To Buy or Not to Buy - Hard Version (35)


#define _CRT_SECURE_NO_WARNINGS#include <cstdio>#include <cstdlib>#include <cstring>#include <cctype>#include <climits>#include <algorithm>using namespace std;const int N = 1010;struct bead {int arr[62], len;char str[N];void read(void) {scanf("%s", str);return;}void convert(void) {int i;len = strlen(str);memset(arr, 0, 62 * sizeof(int));for (i = 0; str[i] != '\0'; i++) {if (isdigit(str[i])) {arr[str[i] - '0']++;}else if (isupper(str[i])) {arr[str[i] - 'A' + 10]++;}else {arr[str[i] - 'a' + 36]++;}}return;}};struct record {int arr[62];int num;};void DFS(bead arr[], int index, int n, bead &target);void cmp(bead *arr, bead &target, record &r);int min_extra, residue, extra;bool *visit;int main(void) {int n, i;bead *arr, target;record r;setvbuf(stdin, new char[1 << 20], _IOFBF, 1 << 20);target.read();target.convert();scanf("%d", &n);visit = new bool[n];arr = new bead[n];for (i = 0; i < n; i++) {arr[i].read();arr[i].convert();}residue = target.len;for (i = 0; i < n && residue; i++) {cmp(arr + i, target, r);}if (residue) {printf("%s %d", "No", residue);}else {min_extra = INT_MAX;for (i = 0; i < n && min_extra; i++) {residue = target.len;extra = 0;memset(visit, 0, n * sizeof(bool));target.convert();DFS(arr, i, n, target);}printf("%s %d", "Yes", min_extra);}return 0;}void DFS(bead arr[], int index, int n, bead &target) {int i, j;record r;memset(&r, 0, sizeof(record));cmp(arr + index, target, r);extra += (arr[index].len - r.num);visit[index] = true;if (r.num && extra < min_extra && residue) {for (i = index + 1; i < n; i++) {if (!visit[i]) {DFS(arr, i, n, target);}}}if (extra < min_extra && !residue) {min_extra = extra;}visit[index] = false;for (i = 0; i < 62; i++) {target.arr[i] += r.arr[i];}residue += r.num;extra -= (arr[index].len - r.num);return;}void cmp(bead *arr, bead &target, record &r) {int i;for (i = 0; i < 62 && residue; i++) {if (target.arr[i] && arr->arr[i]) {if (target.arr[i] >= arr->arr[i]) {target.arr[i] -= arr->arr[i];residue -= arr->arr[i];r.arr[i] = arr->arr[i];r.num += arr->arr[i];}else {residue -= target.arr[i];r.arr[i] = target.arr[i];r.num += target.arr[i];target.arr[i] = 0;}}}return;}


0 0
原创粉丝点击