題目大意:將n個數分解成若干組,如4 = 2+2, 7 = 2+2+3,保證所有組中數字之差<=1。
首先我們能想到找一個最小值x,然后從x+1到1枚舉並check,找到了就輸出。這是40分做法。
能不能優化?我們發現,若k合法,那么x%k==0或x%(k+1)==0或x%(k-1)==0。
所以枚舉倍數就行了,利用貪心找到了就輸出。
代碼:
#include<cstdio> #include<algorithm> using namespace std; #define ll long long int n; ll a[505],mn=0x3f3f3f3f; bool cmp(ll x,ll y) { return x<y; } void check(ll k) { if(!k)return ; ll ret = 0; for(int i=1;i<=n;i++) { if(a[i]<k-1)return ; int cnt = a[i]/k+(a[i]%k!=0); if(a[i]%k==0) { ret+=cnt; continue; } if(k*cnt-a[i]>cnt)return ; ret+=cnt; } printf("%I64d\n",ret); exit(0); return ; } int main() { // freopen("C.in","r",stdin); // freopen("C.out","w",stdout); scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%I64d",&a[i]); mn=min(mn,a[i]); } for(int i=1;i<=mn;i++) { check(mn/i+1); check(mn/i); check(mn/i-1); } fclose(stdin); fclose(stdout); return 0; }