这场educational round 真的学到很多……C题代码极易有缺陷,FST了无数人,D、E都非常简单,但C题这一关真的需要细想才能过去……
将数据排序之后依照将最小的那个分成的个数的情况来挨个看。
[个数*(x-1),个数*x]区间内的数都能取得,x为符合“个数*x">=a[1]的最小的x。
(注意如果a[1]%x==0时,令x+1为x对于a[1]也没有问题,所以这时x+1也要判断下)
之后再用这个x对后面的下标2——n的数进行检验。检验方式依旧是看a[i]是否在那个区间里,不过,这时是x固定,求个数。
1 #include <iostream> 2 #include <string> 3 #include <algorithm> 4 #include <cstring> 5 #include <cstdio> 6 #include <cmath> 7 typedef long long ll; 8 typedef unsigned long long ull; 9 using namespace std; 10 const int MAX=505; 11 int a[MAX]; 12 int n; 13 ll an,tem; 14 int da; 15 int check(int fen,int shu) 16 { 17 int ge=(shu+fen-1)/fen; 18 if(ge*(fen-1)<=shu) 19 return ge; 20 return 0; 21 } 22 ll check2(int da) 23 { 24 ll re=0; 25 int tem; 26 for(int i=2;i<=n;i++) 27 { 28 tem=check(da,a[i]); 29 if(tem==0) 30 return -1; 31 else 32 re+=tem; 33 } 34 return re; 35 } 36 int main() 37 { 38 scanf("%d",&n); 39 for(int i=1;i<=n;i++) 40 scanf("%d",&a[i]); 41 sort(a+1,a+1+n); 42 for(int i=1;i<=sqrt(a[1]);i++) 43 { 44 da=(a[1]+i-1)/i; 45 if(a[1]%da==0) 46 { 47 da++; 48 an=check(da,a[1]); 49 tem=check2(da); 50 if(tem!=-1) 51 { 52 an+=tem; 53 cout<<an<<" "; 54 return 0; 55 } 56 da--; 57 } 58 an=check(da,a[1]); 59 tem=check2(da); 60 if(tem!=-1) 61 { 62 an+=tem; 63 cout<<an<<" "; 64 return 0; 65 } 66 } 67 }