) Написать программу, которая в двумерном массиве типа int размером N строк и M столбцов циклически сдвигает элементы каждой строки вправо на число позиций, равное индексу этой строки.
public class Main { public static BufferedReader READER = new BufferedReader(new InputStreamReader(System.in)); public static void main(String[] args) throws IOException { int N = Integer.parseInt(READER.readLine()); int[] array = new int[N]; for(int i = 0; i < array.length; ++i) array[i] = Integer.parseInt(READER.readLine()); System.out.println("Negative: " + Main.function(array)); } public static boolean function(int[] array) { for(int number : array) if(number >= 0) return false; return true; } }
Лемма. Если на каком-то шаге все куски одинаковой массы m, то можно путём указанных операций сделать так, чтобы все куски стали массой m/2. Доказательство. На первом шаге съедаем кусок массы m и разрезаем другой кусок массы m. Получится 8 кусков массы m и 2 куска массы m/2. Теперь 8 раз съедаем куски m/2 и распиливаем куски массы m.
Перейдём к собственно решению. Понятно, что Саша не мог съесть весь сыр. Поэтому, поскольку он съел целое число граммов сыра, он мог съесть не более, чем 360 - 1 = 359 граммов. Покажем, как он это мог сделать.
Пусть изначально головка сыра была разрезана так: 5 кусков по 512/9 г, 2 куска по 256/9 г, 1 кусок 128/9 г, 1 кусок 32/9 г, 1 кусок 8/9 г (легко проверить, что сумма всех масс равна 360).
Сначала съедим куски массой 8/9, 32/9, 128/9 и распилим три куска по 512/9 г. Останется 2 куска по 512/9 и 8 кусков по 256/9. Затем дважды съедим куски по 256/9 и разрежем оставшиеся куски по 512/9. После этого будет 10 кусков по 256/9.
Уменьшим размер каждого куска в 256 раз (воспользуемся 8 раз процессом, описанным в лемме). Тогда останутся 10 кусков массой 1/9 г. Съедаем один кусок и распиливаем любой оставшийся кусок. Несъеденная масса 9 * 1/9 = 1 г, значил, съел Саша 360 - 1 = 359 г сыра.
include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
const unsigned M=5;
void init_array(int A[][M], unsigned n);
void print_of_array(int A[][M], unsigned n);
void swap (int *pa, int *pb);
void changing_of_array(int A[][M], unsigned n);
int main(){
const unsigned N=5;
int A[N][M];
init_array(A,N);
print_of_array(A,N);
printf("\n");
printf("\n");
changing_of_array(A,N);
print_of_array(A,N);
getchar();
return 0;
}
void init_array(int A[][M], unsigned n){
for (unsigned i=0; i<n; i++)
for (unsigned j=0; j<M;j++)
A[i][j]=rand()%100;
}
void print_of_array(int A[][M], unsigned n){
for (unsigned i=0; i<n; i++){
for (unsigned j=0; j<M;j++)
printf("%5d", A[i][j]);
printf("\n");}
}
void swap(int *pa, int *pb){
int temp=*pa;
*pa=*pb;
*pb=temp;
return;
}
void changing_of_array(int A[][M], unsigned n) {
unsigned l=1;
for (unsigned i=1; i<n; i++) {
for (unsigned j=M-1; j+1>0; j--){
if ((j-l)<0) break;
swap(&A[i][j],&A[i][j-l]); }
l++;
}
}
Объяснение: