杭电1276士兵队列的训练问题
2015-07-15 18:02
423 查看
杭电1276士兵队列的训练问题
本来这题想用直接的模拟法去解答,但一看数据为5000,也还是可以,可是模拟是用数组的话无法直接去掉被删除的元素,用链表可以完全模拟,但是链表操作比较麻烦,想尽量避免链表操作的使用。所以本题就想到了用两个链表来回操作来进行模拟。
首先定义两个数组s1,s2。s1先存储所有士兵的编号,然后由于依次报到2的士兵都会被出列,数组下标与编号对应,这样就可以把数组下标为奇数的元素转到s2,从下标为1连续存储。再依次报到3,士兵出列,再把在数组s2中下标模3不等于0的元素转移到s1中。下标为1依次存储。这样来回转换,利用变量K依次记录转换后还剩下的元素个数,这样来回转换,知道K<=3时停止,对数组s1,或者s2中的元素进行输出
ps:注意士兵数量n<=3的情况,直接对数组元素进行输出。
注意两个输出编号之间的空格。
AC代码:
本来这题想用直接的模拟法去解答,但一看数据为5000,也还是可以,可是模拟是用数组的话无法直接去掉被删除的元素,用链表可以完全模拟,但是链表操作比较麻烦,想尽量避免链表操作的使用。所以本题就想到了用两个链表来回操作来进行模拟。
首先定义两个数组s1,s2。s1先存储所有士兵的编号,然后由于依次报到2的士兵都会被出列,数组下标与编号对应,这样就可以把数组下标为奇数的元素转到s2,从下标为1连续存储。再依次报到3,士兵出列,再把在数组s2中下标模3不等于0的元素转移到s1中。下标为1依次存储。这样来回转换,利用变量K依次记录转换后还剩下的元素个数,这样来回转换,知道K<=3时停止,对数组s1,或者s2中的元素进行输出
ps:注意士兵数量n<=3的情况,直接对数组元素进行输出。
注意两个输出编号之间的空格。
AC代码:
#include<iostream> using namespace std; int main() { int st[6000]; int oz[6000]; int n; cin>>n; while(n--) { int t; int i,j,k; cin>>t; if(t<=3) { for(int i=1;i<t;i++) { cout<<i<<' '; } cout<<t<<endl; } else { int flag=0; for(i=1;i<=t;i++) { st[i]=i; } while(t>3) { j=1; for( i=1;i<=t;i+=2) { oz[j++]=st[i]; } //t=(t+1)>>1; t=j-1; if(t<=3) { flag=1; break; } k=1; for(i=1;i<=t;i++) { if(i%3!=0) { st[k++]=oz[i]; } } t=k-1; if(t<=3) { flag=2; break; } } if(flag==1) { for(i=1;i<t;i++) { cout<<oz[i]<<' '; } cout<<oz[t]<<endl; } if(flag==2) { for(i=1;i<t;i++) { cout<<st[i]<<' '; } cout<<st[t]<<endl; } } } return 0; }
相关文章推荐
- mybatis 插入一条数据返回相应数据ID
- groovy语言主要是用来干什么,和JAVA的区别是什么
- 重载->运算符(感觉怪怪的)
- 嵌入式linux之按键驱动程序
- LeetCode Delete Node in a Linked List
- c# 获取客户端ip、mac、机器名、操作系统、浏览器信息
- mnesia
- 【动态口令】基础
- 5分钟开启Esper之旅
- JUnit框架功能详细——JUnit学习(一)
- 浅谈Python Web的五大框架
- android垃圾回收机制及程序优化System.gc
- 配置Tomcat虚拟目录和主机,通过主机名来访问项目
- abort的理解
- initWithNibName initWithCoder awakeFromNib
- Android Studio 使用笔记:快捷键
- Linux ls命令参数详解 <转>
- java.lang.IllegalStateException: getOutputStream() has already been called for this response
- liunx GHOST clonezilla(再生龙)UltraISO刻录问题
- eclipse的代码贴到word文档的时候,原先的颜色设置都不见了,全都变成黑色的了