参考自:http://blog.csdn.net/lyhvoyage/article/details/12239757
// Problem#: 2015 // Submission#: 2527950 // The source code is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 Unported License // URI: http://creativecommons.org/licenses/by-nc-sa/3.0/ // All Copyright reserved by Informatic Lab of Sun Yat-sen University #include <iostream> #include <cstdio> using namespace std; int main() { int n,m; while (1) { scanf("%d",&n); if (!n) break; int i; int A[1005]; for (i=0;i<=n-1;i++) scanf("%d",&A[i]); scanf("%d",&m); if (n<m) printf("0\n"); else { int left=0,right=2000000,ans=0; while (left<=right) { int sum=0; int mid=(left+right)/2; for (i=0;i<=n-1;i++) if (A[i]>mid) sum+=mid; else sum+=A[i]; if (sum>=mid*m) { ans=mid; left=mid+1; } else right=mid-1; } printf("%d\n",ans); } } return 0; }
思路是先排序,每次都取出最小数目的一个珠子以及最大数目的m-1个珠子,若取后顺序有所改变则重新排序,直到无法再取。
#include <iostream> #include <cstdio> #include <algorithm> using namespace std; int main() { int m,n; int A[1005]; while (1) { scanf("%d",&n); if (!n) break; int i; for (i=0;i<=n-1;i++) scanf("%d",&A[i]); scanf("%d",&m); sort(A,A+n); int pos=0; int ans=0; if (m<=n) { while (1) { if (A[n-m]==A[n-m+1]) { while (A[pos]==0) pos++; if (pos>n-m) break; for (i=n-m+1;i<=n-1;i++) A[i]--; ans++; A[pos]--; sort(A+pos,A+n); } else if (A[n-m+1]-A[n-m]<A[pos]) { for (i=n-m+1;i<=n-1;i++) A[i]-=A[n-m+1]-A[n-m]; ans+=A[n-m+1]-A[n-m]; A[pos]-=A[n-m+1]-A[n-m]; sort(A+pos,A+n); } else { while (A[pos]==0) pos++; if (pos>n-m) break; for (i=n-m+1;i<=n-1;i++) A[i]-=A[pos]; ans+=A[pos]; A[pos]=0; } } } printf("%d\n",ans); } return 0; }