1 solutions
-
0
C :
#include<stdio.h> int n,m,mid,a[100001],r[100001]; void sort(int s,int t) { if(s==t) return; int m=(s+t)/2; sort(s,m); sort(m+1,t); int i=s; int j=m+1; int k=s; while(i<=m&&j<=t) { if(a[i]<=a[j]) r[k++]=a[i++]; else r[k++]=a[j++]; } while(i<=m) r[k++]=a[i++]; while(j<=t) r[k++]=a[j++]; for(i=s;i<=t;i++) a[i]=r[i]; } int judge() { int t=a[1]-m; if(t<0) t=0; for(int i=2;i<=n;i++) { t+=mid; if(a[i]<t) return 0; } return 1; } main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) scanf("%d",&a[i]); sort(1,n); int l=0,r=10000000; if(r>a[n]) r=a[n]; mid=(l+r)>>1; while(l<r-1) { if(judge()) l=mid; else r=mid; mid=(l+r)>>1; } printf("%d",mid); }
C++ :
#include <cstdio> #include <algorithm> #define maxm 10000000 #define maxn 100000 int n , m ; int L = 1 , R , M ; int a[maxn] ; int main() { //#define READ #ifdef READ freopen("sniper.in" , "r" , stdin ) ; freopen("sniper.out", "w" , stdout) ; #endif scanf("%d%d", &n , &m ) ; for (int i = 1 ; i <= n ; i ++ ) scanf("%d", &a[i] ) ; std::sort(a+1,a+n+1) ; R = a[n] ; int pos , flag ; while (L != R) { M = (L+R)>>1 ; if (M == L) M++ ; //printf("M = %d\n",M); pos = -M ; flag = false ; for (int i = 1 ; i <= n ; i ++ ) { //printf("%d\n",a[i]); pos += M ; if (pos > a[i]) { R = M-1 ; flag = true ; break ; } if (a[i]-m-pos > 0) pos += a[i]-m-pos ; } if (flag) continue ; L = M ; } printf("%d\n", L ) ; return 0 ; } /* 6 100 236 120 120 120 120 120 */
- 1
Information
- ID
- 783
- Time
- 1000ms
- Memory
- 128MiB
- Difficulty
- (None)
- Tags
- # Submissions
- 0
- Accepted
- 0
- Uploaded By