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)
感谢:
神
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; }
相关文章推荐
- 1001. Battle Over Cities - Hard Version (35)解题报告
- 1006. Tree Traversals - Hard Version (35)解题报告
- 1012. Greedy Snake (35)解题报告
- 1013. Image Segmentation (35)解题报告
- 1007. Red-black Tree (35)解题报告
- 1014. Circles of Friends (35)解题报告
- 1015. Letter-moving Game (35)解题报告
- 1008. Airline Routes (35)解题报告
- 剑指Offer 面试题35:第一个只出现一次的字符 解题报告(华为OJ034-找出字符串中第一个只出现一次的字符)
- 1016. Uniqueness of MST (35)解题报告
- 1003. Universal Travel Sites (35)解题报告
- 1017. The Best Peak Shape (35)解题报告
- 1010. Lehmer Code (35)解题报告
- RQNOJ 35 营救 解题报告
- 1005. Programming Pattern (35)解题报告
- 1002. Business (35)解题报告
- 1009. Triple Inversions (35)解题报告
- 1011. Cut Rectangles (35)解题报告
- ACM poj 1011 Sticks解题报告源代码【转】
- LeetCode-Lowest Common Ancestor of a Binary Search Tree-解题报告