İki qrupa ayırın#11339

Qeyd edək ki, əgər və n - 3 ədədlərini bir qrupa, n - 1 və n - 2 ədədlərini isə digər qrupa yerləşdirsək (hər qrupdakı ədədlərin cəmi eyni olacaq), məsələ kiçik ölçülü analoji məsələyə, yəni 1, 2, ..., n - 4 ədədlərinin qruplara bölünməsinə gətirilir.

n \le 3 üçün ədədləri qruplara aşağıdakı kimi paylayırıq:

Əgər -dən -ə qədər bütün ədədlərin cəmi cütdürsə, onları cəmi bərabər olan iki qrupa bölmək olar.

Əgər -dən -ə qədər bütün ədədlərin cəmi təkdirsə, onları cəmlərinin fərqi -ə bərabər olan iki qrupa bölmək olar.

Misal

Tutaq ki, n = 10. Ədədləri qruplara aşağıdakı kimi yerləşdiririk:

Tutaq ki, n = 11. Ədədləri qruplara aşağıdakı kimi yerləşdiririk:

Alqoritmin reallaşdırılması

giriş qiymətini oxuyuruq.

scanf("%d", \&n);

Qruplardakı ədədlərin başlanğıc cəmləri s_1 və s_2-ni -a bərabər təyin edirik.

s1 = s2 = 0;

-dən -ə qədər azalan ardıcıllıqla ədədləri gözdən keçiririk.

for (i = n; i \> 0; i--)

Əgər s_1 \< s_2 olarsa, ədədini birinci qrupa daxil edirik. Əks halda ədədini ikinci qrupa daxil edirik.

  if (s1 \< s2)
  {
    s1 += i;
    a.push_back(i);
  }
  else
  {
    s2 += i;
    b.push_back(i);
  }

Qrupların ölçülərini çıxarırıq.

printf("%d %d\n", a.size(), b.size());

Birinci qrupun ədədlərini çıxarırıq.

for (i = 0; i \< a.size(); i++)
  printf("%d ", a[i]);
printf("\n");

İkinci qrupun ədədlərini çıxarırıq.

for (i = 0; i \< b.size(); i++)
  printf("%d ", b[i]);
printf("\n");