Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
C++ AC代码(纯模拟,为了不超时,数据进行了部分减支)#include <iostream> #include <stdlib.h> #include <numeric> //加法用 using namespace std; int *size = new int[7]; int *box = new int[36]; int total, num=0; bool insert_flag(int x, int y, int i) { for (int m = 0; m < i; m++) { for (int n = 0; n < i; n++) if (box[(x + m) * 6 + (y + n)] != 0 || (x + m)>5 || (y + n)>5) return false; } return true; } void pack() { if (num > 0) total++; while (num > 0) { int last, first = 0; for (int i = 1; i <= 6; ++i) { if (size[i] != 0) { if (first == 0) first = i; last = i; } } for (int i = last; i >= first; i--) { while (size[i] != 0) { int x = 0, y = 0; while (!insert_flag(x, y, i) && (x + y) <= 10) { y++; if (y == 6){ y = 0; x++; } } if (x + i <= 6 && y + i <= 6) { for (int m = 0; m < i; m++) for (int n = 0; n < i; n++) box[(x + m) * 6 + (y + n)] = i; size[i]--; num--; } else break; } if (i == first && size[i]!=0 ) { total++; memset(box, 0, 36 * sizeof(int)); break; } } } } int main() { while (1) { total = 0; memset(box, 0, 36 * sizeof(int)); for (int i = 1; i <= 6; ++i) cin >> size[i]; num = accumulate(size + 1, size + 7, 0); if (!num) break; //以下减少运算量 if (size[6] > 0){ total += size[6]; size[6] = 0; } if (size[3] / 4 > 0) { total += size[3] / 4; size[3] = size[3] % 4; } if (size[1] <= 11 * size[5]) size[1] = 0; else size[1] -= 11 * size[5]; if (size[5] > 0){ total += size[5]; size[5] = 0; } num = accumulate(size + 1, size + 7, 0); pack(); cout << total << endl; } delete[]size; delete[]box; system("pause"); return 0; } Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator