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 |
由大到小 多多指教不管由大到小还是由小到大,都要注意一点,遍历的过程中不允许出现中间出现空白,注意这个问题即可,即使不注意这个问题,都能够ac的,数据太弱。即使这样,也应当写出最准确的代码,这才是刷题追求的 #include<iostream> #include<string> #include <iomanip> #include<math.h> #include <fstream> using namespace std; int input[10] = {}; int data[10] = { 1, 4, 9, 16, 25, 36, 49, 64, 81, 100 }; int a[40] = {}; int size; int total_times = 0; //置位 bool set(int x, int length) { if (x + length > size) { return false; } int index = x, error = 1; for (; index < length + x; index++) { a[index] += length; if (a[index]> size) { error = 0; break; } } if (!error) { //还原现场 for (int i = x; i <= index; i++) { a[i] -= length; } } return error; } //选占用最短的x,顺便获取支持最长长度 void maxLeft(int &x, int &maxLength) { x = 0; for (int i = 1; i < size; i++) { if (a[x] > a[i]) x = i; } maxLength = 0; for (int i = x; i < size; i++) { if (a[x] == a[i]) { maxLength ++; } else { break; } } } //清楚上次操作 void clearLast(int x, int length) { for (int i = x; i < x + length; i++) { a[i] -= length; } } //x为选择的列,maxLength为选择该列时最大支持的正方形大小 bool dfs(int x, int maxLength) { total_times++; int result = 0, left = 0; for (int i = 9; i >= 0; i--) { if (input[i]) { //正方形放完即认为结束,否则继续dfs left = 1; if (maxLength >= i && set(x, i + 1)) //maxLength这里用于减枝,不然会tle { int next_x, next_maxLength; maxLeft(next_x, next_maxLength); input[i] --; result = dfs(next_x, next_maxLength); if (result) { return true; } else { //还原现场 input[i] ++; clearLast(x, i + 1); } } } } if (left == 0) { return true; } return result; } int main() { //ifstream in("d:\\document\\test.txt"); int max_case = 0, temp_value, cur_case = 0; cin >> max_case; getchar(); while (cur_case < max_case) { total_times = 0; cur_case++; int count = 0; int max_size = 0, max_value = 0, temp = 0; memset(input, 0, 10 * sizeof(int)); memset(a, 0, 40 * sizeof(int)); cin >> size >> count; for (int i = 0; i < count; i++) { cin >> temp; max_size += data[temp - 1]; input[temp - 1] ++; } if (max_size != size * size) { cout << "HUTUTU!" << endl; } else { if (dfs(0, 10)) { cout << "KHOOOOB!" << endl; } else { cout << "HUTUTU!" << endl; } } } 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