Pagini recente » Cod sursa (job #1500697) | Cod sursa (job #3041077) | Cod sursa (job #1287676) | Cod sursa (job #2662486) | Cod sursa (job #1122682)
#include <cstdio>
#define Nmax 100005
using namespace std;
FILE *fi = fopen("grupuri.in", "r");
FILE *fo = fopen("grupuri.out", "w");
int n;
int k;
int v[Nmax];
int ct = 0;
int sol = 0;
int poz;
void citire()
{
fscanf(fi, "%d%d", &k, &n);
for (int i = 1; i<=n; i++)
{
fscanf(fi, "%d", &v[n-i+1]);
if (v[n-i+1] > 0) ct++;
}
}
void sortare()
{
int poz2 = k+1;
if (v[k+2] == v[k+1])
for (poz2 = k+2; poz2<=n && v[poz2] == v[k+1]; poz2++);
if (k - poz + 1 == poz2 - k)
{
for (int i = poz; i <= k; i++) v[i]++;
for (int i = k+1; i <= poz2; i++) v[i]--;
}
else if (k - poz + 1 > poz2 - k)
{
for (int i = poz; i<= poz + poz2 - k - 1; i++) v[i]++;
for (int i = k+1; i<=poz2; i++) v[i]--;
}
else if (k - poz + 1 < poz2 - k)
{
for (int i = poz; i<=k; i++) v[i]++;
for (int i = poz2 + poz - k; i<=poz2; i++) v[i]--;
}
}
void rezolvare()
{
int prima;
while (ct >= k)
{
sol++;
prima = 1;
for (int i = 1; i<=k; i++)
{
v[i]--;
if (v[i] < v[k+1] && prima)
{
poz = i;
prima--;
}
if (!v[i])
ct--;
}
if (v[k] < v[k+1]) sortare();
}
}
int main()
{
citire();
rezolvare();
fprintf(fo, "%d", sol);
return 0;
}