#include #include #include #include #include int max(int a,int b) { if (a > b) return a; else return b; } int min(int a,int b) { if (a < b) return a; else return b; } int main() { int T; scanf("%d", &T); for (int t = 0; t < T; t++) { int n; scanf("%d", &n); std::vector a(n),b(n); for (int i=0; i < n; i++) { std::cin >> a[i]; } for (int i=0; i < n; i++) { std::cin >> b[i]; } int mx = 0; for(int i = 0; i < a.size(); i++) { for(int j = 0; j < b.size(); j++) { mx += min(a[i],b[j]); } } int mn=0; /* std::vector< std::vector > plan(n, std::vector(n,0)); std::vector x(n,false); std::vector y(n,false); std::sort(a.begin(), a.end()); std::sort(b.begin(), b.end()); for (int i = 0; i < n;i++) { for (int j = 0; j < n; j++) { if (b[j] >= a[i]) { plan[i][j] = a[i]; break; } } } /* // DEBUG for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { std::cout << plan[i][j]<<" "; } std::cout << std::endl; } // END DEBUG * for (int i = 0; i < n;i++) { for (int j = 0; j < n; j++) { if (a[j] >= b[i]) { plan[j][i] = b[i]; break; } } } /* // DEBUG for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { std::cout << plan[i][j]<<" "; } std::cout << std::endl; } // END DEBUG * for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { mn+=plan[i][j]; } //std::cout << std::endl; } */ sort(a.begin(), a.end()); sort(b.begin(), b.end()); reverse(a.begin(), a.end()); reverse(b.begin(), b.end()); int pa=0, pb= 0; std::vector uni; while (pa <= a.size() || pb <= b.size()) { //std::cout << pa << " l " << pb << " " << uni.size() << std::endl; if (a[pa] == b[pb]){ int pat = pa; int pbt = pb; while (a[pa] == a[pat]) pat++; while (b[pb] == b[pbt]) pbt++; if ((pat-pa) > (pbt-pb)) { for (int i = pa; i < pat; i++ ) { uni.push_back(a[pa]); } } else { for (int i = pb; i < pbt; i++ ) { uni.push_back(b[pb]); } } pa=pat; pb = pbt; } else { if (a[pa] > b[pb]) { while (a[pa] > b[pb]) { uni.push_back(a[pa]); pa++; } } else { while (b[pb] > a[pa]) { uni.push_back(b[pb]); pb++; } } } } if (pa == a.size()) { for (int i = pb; i < b.size(); i++) { uni.push_back(b[i]); } } else { for (int i = pa; i < a.size(); i++) { uni.push_back(a[i]); } } for (int i = 0; i < uni.size(); i++) { //std::cout << uni[i] << " "; mn+=uni[i]; } printf("Minimalni budova obsahuje %d kostek, maximalni %d kostek.\n", mn, mx); } return 0; }