1、UVa 11100 - The Trip, 2007
题意:给出若干大小不同的包裹,小的能够装在大的包裹里面。求最小的大包裹数,并且保证在所有的大包裹中,所含有的小包裹数目最小。
思路:显然,相同大小的包只能放在不同的大包里,那么最小的大包数目就是相同大小的包的最大数目,记为k。之后,根据从小到大排序后,对于每个大包i可选取从i开始,间隔k个包的那些包裹作为该大包从里到外的各个包裹。
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 int dm[10005]; 5 int main() 6 { 7 int k = 1,n,i,t; 8 while (cin >> n, n != 0) 9 { 10 for (i = 0; i < n; i++) cin >> dm[i]; 11 sort(dm, dm + n); 12 int maxt = 1; 13 for ( i = 1, t = 1; i < n; i++) 14 { 15 if (dm[i] == dm[i - 1]) t++; 16 else 17 { 18 if (t > maxt) maxt = t; 19 t = 1; 20 } 21 } 22 if (t > maxt) maxt = t; 23 if (k > 1) cout << endl; 24 cout << maxt << endl; 25 for (int i = 0; i < maxt; i++) 26 { 27 for (int j = i; j < n; j += maxt) 28 { 29 if (j == i) cout << dm[j]; 30 else cout << ' ' << dm[j]; 31 } 32 cout << endl; 33 } 34 k++; 35 } 36 return 0; 37 }