A. 数组-删除某个数
时间:0.2 空间:32M
题目描述:
在给定的数组中删除一个数
输入格式:
多组测试,每组测试包含三行:第一行是一个整数表示数组的大小n,第二行是n个整数,第三行是要求删除的数字m。
输出格式:
删除在第二行n个整数中第一次出现数字m并删除,然后按照顺序输出剩下的数
样例输入1:
4 1 2 3 4 3
样例输出1:
1 2 4
样例输入2:
5 6 5 2 1 7 9 7 2 5 5 2 4 7 6 2
样例输出2:
6 5 2 1 7 5 5 2 4 7 6
提示:
1≤n≤100
m有可能在原数组中找不到,找不到则输出原数组
while(cin>>?){
flag=true;
for(int i=1;i<=n;i++)cin>>a[i];
cin>>?;
for(int i=1;i<=?;i++){
if(a[i]==m){
if(flag){
?=false;
}
else{
cout<<?<<" ";
}
}
else cout<<?<<" ";
}
cout<<"?";
}
水题,不用讲
B. 双链表
时间:1s 空间:256M
题目描述:
实现一个双链表,双链表初始为空,支持5种操作:
1.在最左侧插入一个数;
2.在最右侧插入一个数;
3.将第k个插入的数删除;
4.在第k个插入的数左侧插入一个数;
5.在第k个插入的数右侧插入一个数;
现在要对该链表进行M次操作,进行完所有操作后,从左到右输出整个链表。
注意:题目中第k个插入的数并不是指当前链表的第k个数。例如操作过程中一共插入了n个数,
则按照插入的时间顺序,这n个数依次为:第一个插入的数,第二个插入的数,…第n个插入的数。
输入格式:
第一行包含整数M,表示操作次数。
接下来M行,每行包含一个操作命令,操作命令可能为以下几种:
1.L x,表示在链表的最左端插入数x。
2.R x,表示在链表的最右端插入数x。
3.D k,表示将第k个插入的数删除。
4.IL k x,表示在第k个插入的数左侧插入一个数。
5.IR k x,表示在第k个插入的数右侧插入一个数。
输出格式:
共一行,将整个链表从左到右输出。
数据范围:
1 ≤ M ≤ 100000
所有操作保证合法。
样例输入:
10
R 7
D 1
L 3
IL 2 10
D 3
IL 2 7
L 8
R 9
IL 4 7
IR 2 2
样例输出:
8 7 7 3 2 9
模板题要记
void init()
{
r[0] = 1, l[1] = 0;
idx = 2;
}
void add(int k, int x)
{
e[idx] = x;
r[idx] = r[k];
l[idx] = k;
l[r[k]] = idx;
r[k] = idx;
idx ++ ;
}
void del(int k)
{
r[l[k]] = r[k];
l[r[k]] = l[k];
}
C. 加强保密
时空限制:1S,64MB
问题描述:
为了加强保密,我们不能再使用一整串联系序列了!现在我们使用一个多组单线联系的关系,来构造整个联系表。构造方法如下。
先将 1 号特工安排进联系表,这时表中只有他一个人;
2−N 号特工依次加入联系表,代号为 i 的特工联系方式为:指定代号为 i 的特工是代号为 1∼(i−1) 中某位特工(即之前已经在联系表的特工)的上级或下级;
在所有特工的联系关系按照上述方法建立完毕后,就形成了新的联系表。
输入格式
第 1 行为一个正整数 N,表示了有 N 个同学。
第 2−N 行,第 i 行包含两个整数 k,p,其中 k 为小于 i 的正整数,p 为 0 或者 1。若 p 为 0,则表示将 i 号特工是 k 号特工的上级,p 为 1 则表示是下级。
输出格式
1 行,包含 N 个空格隔开的正整数,表示了联系表从上到下所有特工的代号。
输入输出样例
输入
4
1 0
2 1
1 0
输出
2 3 4 1
说明/提示
样例解释:
特工 2 是特工 1 的上级,此时联系表为:
2 1
特工 3 是特工 2 的下级,此时联系表为:
2 3 1
特工 4 是特工 1 的上级,此时联系表为:
2 3 4 1
数据范围
对于 20% 的数据,有 N≤10;
对于 40% 的数据,有 N≤1000;
对于 100% 的数据,有 N≤100000。
上题略加改编即可
add(0,1);
for(int i=2;i<=n;i++){
int op,k;
cin >> k>>op;
if(op==1)add(k+1,i);
else if(op==0)add(l[k+1],i);
}
for (int i = r[0]; i != 1; i = r[i]) cout << e[i] << ' ';