知识点:
(原理)
队列 是一种先进先出的线性表。其限制仅在表的一端(尾端)进行插入,另一端(首端)进行删除的线性表,先进先出FIFO。
(例题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1276
题目分析:第一步用数组A存下所有的数 判断A数组的长度是否大于三如果大于三则循环
第二步用数组B存下筛选后留下的数 清空A数组 把B数组的结果复制给A数组
第三步依次按下标进行循环剔除,直到A数组小于等于3跳出循环
题解代码:
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
int main()
{
int n=0,i=0,j=0,m=0,a[5000]={0},b[2500]={0},len=0;
while(scanf("%d",&n)!=EOF){
for(i=0;i<n;i++){
scanf("%d",&len);
if(len==1){ //如果士兵数量最开始就不大于三个
printf("%d\n",len);
continue;
}
if(len<=3){
for(m=1;m<len;m++){
printf("%d ",m);
}
printf("%d\n",m);
continue;
}
for(m=0;m<len;m++){
a[m]=m+1; //给A数组赋初值
}
while(len>3){
for(m=0;m<len;m++){ //剔除1212的 从0开始即保留偶数下标的
if(m%2==0){
b[j++]=a[m];
}
}
len=j;
memset(a,0,sizeof(a));
for(j=0;j<len;j++{
a[j]=b[j];
}
if(len<=3){
j=0;
break;
}
j=0;
for(m=0;m<len;m++) //剔除123123的 从0开始即保留偶数下标的
if((m+1)%3!=0){
b[j++]=a[m];
}
}
len=j;
memset(a,0,sizeof(a)); //清空a数组
for(j=0;j<len;j++){
a[j]=b[j];
}
j=0;
}
for(m=0;m<len-1;m++){
printf("%d ",a[m]);
}
printf("%d\n",a[m]); //输出结果 此处应注意此题的输出格式
memset(a,0,sizeof(a));
}
}
}
网友评论