Ranking (as of 2013-06-29): 139 out of 949
Language: C++
Applied backtrack.
/* UVa 10364 - Square To build using Visual Studio 2010: cl -EHsc -O2 UVa_10364_Square.cpp */ #include <iostream> #include <algorithm> using namespace std; const int ns_max = 20; struct stick { bool used_; int length_; bool operator<(const stick& s) const {return length_ > s.length_;} } sticks[ns_max]; bool form_square(int n /* number of sticks */, int i /* index to sticks[] */, int nrs /* number of remaining sides */, int sl /* side length */, int rsl /* remaining side length */) { if (!rsl) { if (!--nrs) return true; else return form_square(n, 0, nrs, sl, sl); } else { for (int j = i; j < n; j++) if (sticks[j].length_ <= rsl && !sticks[j].used_) { sticks[j].used_ = true; if (form_square(n, j + 1, nrs, sl, rsl - sticks[j].length_)) return true; sticks[j].used_ = false; } return false; } } int main() { int t; cin >> t; while (t--) { int n; cin >> n; int s = 0; for (int i = 0; i < n; i++) { sticks[i].used_ = false; cin >> sticks[i].length_; s += sticks[i].length_; } int sl = s / 4; bool yes = true; if (sl * 4 != s) yes = false; else { for (int i = 0; i < n; i++) if (sticks[i].length_ > sl) { yes = false; break; } if (yes) { sort(sticks, sticks + n); // sort in descending order of lengths yes = form_square(n, 0, 4, sl, sl); } } cout << ((yes) ? "yes\n" : "no\n"); } return 0; }
I tried to solve this using iterating over all subsets and counting the number of subsets , sum of whose elements is 1/4th of the sum of length of all sticks.
ReplyDeleteBut I am getting WA. Please tell me where I am going wrong
Here's the link to code:
http://pastebin.com/KxzrnnDL