Pagini recente » Cod sursa (job #645725) | Cod sursa (job #2438823) | Cod sursa (job #1056431) | Cod sursa (job #2261238) | Cod sursa (job #590633)
Cod sursa(job #590633)
#include <iostream>
#include <cstdio>
#define Infinit 1000000000
using namespace std;
long long N, K, CS[1000005], A[100005], AMax, NGrupuri;
void Read ()
{
FILE *fin = fopen ("grupuri.in", "r");
long long i;
fscanf (fin, "%ld%ld", &K, &N);
for (i=0; i<N; i++)
{
fscanf (fin, "%ld", &A[i]);
if (A[i]>AMax)
{
AMax=A[i];
}
}
fclose (fin);
}
void Type ()
{
FILE *fout = fopen ("grupuri.out", "w");
fprintf (fout, "%lld\n", NGrupuri);
fclose (fout);
}
void CountingSort ()
{
long long i, j;
for (i=0; i<=AMax; i++)
{
CS[i]=0;
}
for (i=0; i<N; i++)
{
CS[A[i]]++;
}
N=0;
for (i=AMax; i>0; i--)
{
for (j=0; j<CS[i]; j++)
{
A[N++]=i;
}
}
}
inline long Max (long a, long b)
{
if (a>b)
{
return a;
}
return b;
}
inline long Min (long a, long b)
{
if (a>b)
{
return b;
}
return a;
}
int Possible (long G)
{
long long i, NAnimale=0;
for (i=0; i<N; i++)
{
NAnimale+=Min(A[i], G);
}
if (NAnimale/G>=K)
{
return 1;
}
return 0;
}
int main ()
{
long long Left, Right, Middle;
Read ();
CountingSort ();
AMax=A[0];
Left=1;
Right=A[0]*N;
while (Left<=Right)
{
Middle=(Left+Right)/2;
if (Possible (Middle)==1)
{
Left=Middle+1;
NGrupuri=Middle;
}
else
{
Right=Middle-1;
}
}
Type ();
return 0;
}