Advertisement
Guest User

Untitled

a guest
Jan 11th, 2013
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.12 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstdlib>
  3. #include <cstring>
  4. #include <cassert>
  5. #include <cmath>
  6. #include <ctime>
  7. #include <algorithm>
  8. #include <vector>
  9. #include <string>
  10. #include <queue>
  11. #include <deque>
  12. #include <list>
  13. #include <set>
  14. #include <map>
  15.  
  16. using namespace std;
  17.  
  18. #define pb push_back
  19. #define mp make_pair
  20. #define eprintf(...) fprintf(stderr, __VA_ARGS__)
  21. #define sz(x) ((int)(x).size())
  22. #define TASKNAME "cards"
  23.  
  24. typedef long long ll;
  25. typedef vector<int> vi;
  26. typedef vector<vi> vvi;
  27. typedef vector<bool> vb;
  28. typedef vector<vb> vvb;
  29. typedef pair<int, int> pii;
  30.  
  31. const int MAXN = 1010;
  32. vi ws[MAXN + 1];
  33.  
  34. int main() {
  35.   freopen(TASKNAME".in", "r", stdin);
  36.   freopen(TASKNAME".out", "w", stdout);
  37.  
  38.   int tn;
  39.   scanf("%d", &tn);
  40.   while (tn --> 0) {
  41.     int n, w, h;
  42.     scanf("%d%d%d", &n, &w, &h);
  43.     for (int i = 0; i <= n; i++) ws[i].clear();
  44.  
  45.     ws[1].pb(w);
  46.     ws[1].pb(h);
  47.     sort(ws[1].begin(), ws[1].end());
  48.  
  49.     vi tmp, tmp2;
  50.     for (int cn = 2; cn <= n; cn++) {
  51.       for (int l = 1; l < cn; l++) {
  52.         int r = cn - l;
  53.         tmp.resize(sz(ws[l]));
  54.         tmp.erase(set_intersection(ws[l].begin(), ws[l].end(), ws[r].begin(), ws[r].end(), tmp.begin()), tmp.end());
  55.         tmp2.resize(sz(ws[cn]) + sz(tmp));
  56.         tmp2.erase(set_union(ws[cn].begin(), ws[cn].end(), tmp.begin(), tmp.end(), tmp2.begin()), tmp2.end());
  57.         ws[cn].swap(tmp2);
  58.       }
  59.       tmp.resize(sz(ws[cn]));
  60.       int sq = cn * w * h;
  61.       for (int i = 0; i < sz(ws[cn]); i++) {
  62.         tmp[i] = sq / ws[cn][i];
  63.       }
  64.       reverse(tmp.begin(), tmp.end());
  65.  
  66.       tmp2.resize(2 * sz(ws[cn]));
  67.       tmp2.erase(set_union(tmp.begin(), tmp.end(), ws[cn].begin(), ws[cn].end(), tmp2.begin()), tmp2.end());
  68.       ws[cn].swap(tmp2);
  69.  
  70. /*      eprintf("cn=%d: ", cn);
  71.       for (int i = 0; i < sz(ws[cn]); i++)
  72.         eprintf("%d%c", ws[cn][i], "\n "[i + 1 < sz(ws[cn])]);*/
  73.     }
  74.     int ans = 2e9;
  75.     int sq = n * w * h;
  76.     for (int i = 0; i < sz(ws[n]); i++) {
  77.       int w = ws[n][i];
  78.       int h = sq / w;
  79.       ans = min(ans, w + h);
  80.     }
  81.     printf("%d\n", ans * 2);
  82.   }
  83.   return 0;
  84. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement