您的位置:首页 > 其它

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

2017-01-13 22:56 555 查看
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
;
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
;
arr = new bead
;
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: