Сформулируем эту задачу следующим образом. В каждой строке i массива A выберем максимальное среди чисел A[i, j] (j не равно i) и сложим его с A[i, i]. Найти i, при котором соответствующая сумма будет минимальна.
#include <stdio.h>
#define K 20
main()
{int i,j,k,i1,s,t,a[K][K];
scanf("%d",&k);
for (i=0;i<k;i++)
for(j=0;j<k;j++) scanf("%d" ,&a[i][j]);
for (i=0;i<k;i++)
{for (s=0,j=0;j<k;j++)
if(j!=i && s<a[i][j]) s=a[i][j];
s+=a[i][i];
if (i==0 || s<t) {i1=i; t=s;}
}
printf("%d\n" ,i);
}
Задача N16.
Даны два упорядоченных массива a[1]<=a[2]<=...<=a[m] и
b[1]<=b[2]<=...<=b[n]. Образовать из них упорядоченный массив
c[1]<=c[2]<=...c[m+n].
Эта задача принципиально должна быть выполнена за m+n действий. Возьмем из A и B по первому элементу. Меньший из них занесем в С и заменим следующим из его же массива. Снова выберем меньший из двух, занесем в С и т.д.
После каждого сравнения в С добавляется элемент - значит, сравнений будет меньше, чем m+n. Нужно только позаботиться о том, чтобы программа работала верно и при исчерпании одного из массивов.
#include <stdio.h>
#define mm 100
#define nn 100
main()
{ int m,n,i,j,k,a[mm],b[nn],c[mm+nn];
scanf("%d %d",&m,&n);
for (i=0;i<m;i++) scanf("%d",&a[i]);
for(j=0;j<n;j++) scanf("%d",&b[j]);
for(k=i=j=0;k<m+n; k++)
{if (i>=m) c[k]=b[j++];
else if (j>=n) c[k]=a[i++];
else if (a[i]>b[j]) c[k]=b[j++];
else c[k]=a[i++];
}
for (k=0;k<m+n; k++)
printf("%4d%c",c[k],(k+1)%10==0 || k==m+n-1?'\n':' ');
}
Задача N17.
На квадратном клетчатом листе бумаги размерами 100х100 нарисовано несколько прямоугольников: каждый из прямоугольников состоит из некоторого числа целых клеток, причем различные прямоугольники не накладываются и не соприкасаются друг с другом.
Написать программу, которая сосчитает и напечатает число прямоугольников.
Эта задача решается следующим образом – прямоугольников столько, сколько их северо-западных углов (иначе говоря - верхних левых). Остается только не запутаться в случае, когда угол стоит у границы.
#include <stdio.h>
#define mm 20
#define nn 20
main()
{ int m,n,j,i,s,a[mm][nn];
scanf("%d %d",&m,&n);
for(i=0; i<=m;i++)
for (j=0;j<n; j++)
if (a[i][j]=i*j) scanf("%d" ,&a[i][j]);
for (s=0,i=1;i<=m; i++)
for (j=1;j<=n; j++)
if (a[i][j] && !(a[i-1][j]+a[i][j-1])) s++;
printf ("%d\n",s);
}