今年8月に受験をひかえているのですが、学部での専攻が情報系ではなく、現段階で初歩的な教本を片手に勉強しているところです。教本に書かれていることは理解できるのですが、いざ問題を解くとなるとなかなかできません。

(1)は実際にプログラムを再現してみて、値を代入したら答えはわかるのですが、このような筆記試験では頭の中で場合分けを重ねて時間をかけて答えをだすしかないのでしょうか。
(2)は題意はわかるのですが、まったくアイデアが思い浮かびません。

#include <stdio.h>
int    a[]={2,17,12,4,6,19,10,13,12,7};
int    b[]={0,0,0,0,0};
void f1(int na, int a[], int nb, int b[]){
    int i,j,k;
    for (i=0;i<na;i++){
    for (j=0;j<nb;j++){
        if (a[i]>b[j]){
            break;
            }
        }
        if (j <nb-1){
            for (k=nb-2;k>j;k--){
            b[k+1]=b[k];
            }
            b[j]=a[i];
        }
    }
}
int main(void){
    int t=0;
    f1(10,a,5,b);
    for (t=0;t<=4;t++){
        printf("%d\n",b[t]);
}
return (0);
}
#include <stdio.h>
int    a[]={1,2,3,4,5,6,7,8,9,10};
int    b[]={0,0,0,0,0};
void f1(int na, int a[], int nb, int b[]){
    int i,j,k;
    for (i=0;i<na;i++){
        for (j=0;j<nb;j++){
            if(a[i]>b[j]){
                break ;
            }
        }
        if (j==4){
            b[j]=a[i];
         }else{
            for(k=nb-2;k>j-1;k--){
                b[k+1]=b[k];
            }
            b[j]=a[i];
         }
    }
}
int main(void){
    int t=0;
    f1(10,a,5,b);
    for (t=0;t<=4;t++){
        printf("%d\n",b[t]);
}
return (0);
}