去除干员 (delete)
题目描述
有一款游戏叫《明日方舟》( kokodayo ),这款游戏里有许多干员,现在从中挑出N位来,组成一个编队,编号为i的干员有一个战斗力ai。
Konnyaku_LXZ 很爱玩这款游戏,但他想玩的有游戏体验一点,因此他不想带战斗力为M的干员,可是他又不想再弄一个编队。所以,他想直接将原来编队的长度缩短并且将里面战斗力为M的所有干员全部去除。
但是他实在是太弱了,不知道该怎么办,于是他找到了你,请你来帮他解决这个问题。
要求:不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(1)额外空间的条件下完成(即不能再开一个数组)。
注意: O(1)额外空间并不代表只能定义一个变量,额外空间指除了 N,M 和 a 数组以外的空间
你不需要考虑编队新长度之外的干员以及其战斗力。
输入
第一行一个非负整数N,表示该编队内共有N位干员。
接下来一行共N个数,第i个数表示编号为i的干员的战斗力ai。
最后一行一个非负整数M,表示要从编队中去除战斗力为M的干员。
输出
第一行一个非负整数Ans,表示去除战斗力为M的干员后编队内干员的数量。
接下来一行,共Ans个非负整数,表示编队内剩余的每个干员的战斗力。
注意:原编队中战斗力不为 m 的干员的顺序不可以改变(详情请见样例解释)。
样例输入
4
3 1 2 3
3
样例输出
2
1 2
提示
样例解释:不能输出2,2,1,且你不用考虑你的数组编号为3及以后的数据。
解法
很明显,这道题其实很简单
但问题是
M
M
M和
a
i
a_i
ai实在是太大了,第一个想法是高精度,额不对,叫做字符串
代码简单无比
#include<bits/stdc++.h>
using namespace std;
string a[1000007],m;
int n,nn;
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
//输入加速
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
cin>>m;
//输入
for(int i=1;i<=n;i++)
if(a[i]!=m)
nn++;
cout<<nn<<endl;
//新型队列人数
for(int i=1;i<=n;i++)
if(a[i]!=m)
cout<<a[i]<<" ";
}
然后,
RE
\color{purple}\text{RE}
RE了
⋯
⋯
\cdots\ \cdots
⋯ ⋯
调了几遍,愤怒之下,将
s
t
r
i
n
g
string
string调为
u
n
s
i
g
n
e
d
l
o
n
g
l
o
n
g
unsigned\ long\ long
unsigned long long,过了
之后建议大家少用 s t r i n g string string,能用数组就用数组