P5731 【深基5.习6】蛇形方阵
P2440 木材加工
本次主要对上面两个算法题进行总结
第一题主要要考虑数组进行拐弯的时机与判断条件,指定拐弯的时机以及条件,之后再对每个位置上的数字进行相应的赋值即可,在代码中有详细的注释
#include <stdio.h>
int main()
{
int i,j,n,k=1,t;//k为每个位置需要填的数字,t为转弯的动态次数
int a[100][100];
scanf("%d",&n);
if(n%2==0) t = n/2;//判断循环的次数,如果是奇数,那就加一,如果是偶数,那就直接为t
else t = n/2+1;
for(i=0;i<t;i++){
for(j=i;j<n-i;j++) //方阵的上边,横坐标不变,纵坐标递加
a[i][j]=k++;
for(j=i+1;j<n-i;j++) //方阵的右边,横坐标递加,纵坐标不变
a[j][n-i-1]=k++;
for(j=n-i-2;j>=i;j--) //方阵的下边,横坐标不变,纵坐标递加
a[n-1-i][j]=k++;
for(j=n-2-i;j>=i+1;j--) //方阵的左边,横坐标递加,纵坐标不变
a[j][i]=k++;
}
for(i=0;i<n;i++)//遍历方阵的每个位置
{
for(j=0;j<n;j++)
{
printf("%3d",a[i][j]);
}
printf("\n");
}
return 0;
}
第二题考的是二分法的基本操作
#include<stdio.h>
int main()
{
int n,m,l=0,r=100000001,a[1000000000];
scanf("%d%d",&n,&m);
for (int i=1; i<=n; ++i)
scanf("%d",&a[i]);
while(r-l>1)//判断循环的次数
{
int mid=(l+r)/2;
int sum = 0;
for (int i=1; i<=n; ++i)
sum += a[i]/mid;
if(sum>=m) l=mid;
else r=mid;
}
printf("%d",l);
return 0;
}