Description
给出 \(n\) 个数, 要求把其中重复的去掉, 只保留第一次出现的数.
例如, 给出的数为 1 2 18 3 3 19 2 3 6 5 4
, 其中 \(2\) 和 \(3\) 有重复, 去除后的结果 为 1 2 18 3 19 6 5 4
.
Input
输入第一行为正整数 \(T\), 表示有 \(T\) 组数据. 接下来每组数据包括两行, 第一行为正整数 \(n\), 表示有 \(n\) 个数. 第二行为要去重的 \(n\) 个正整数.
Output
对于每组数据, 输出一行, 为去重后剩下的数字, 数字之间用一个空格隔开.
Sample Input
2
11
1 2 18 3 3 19 2 3 6 5 4
6
1 2 3 4 5 6
Sample Output
1 2 18 3 19 6 5 4
1 2 3 4 5 6
Data Range
对于 30% 的数据,\(1 \leq n \leq 100\), 给出的数不大于 \(100\), 均为非负整数;
对于 50% 的数据,\(1 \leq n \leq 10000\), 给出的数不大于 \(10000\), 均为非负整数;
对于 100% 的数据,\(1 \leq n \leq 50000\), 给出的数在 32 位有符号整数范围内.
Explanation
此题可以水 STL, 然而:
行末要输出空行!! !! !
行末要输出空行!! !! !
行末要输出空行!! !! !
因为这个多交了五六遍...... [Facepalm]
附上 WA 代码 (离散化应该没有错, 然而...... ) :
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long lli;
const int maxn = 50100;
struct srtr
{
lli dat;
int pos;
};
bool operator < (srtr a, srtr b)
{ return a.dat < b.dat; }
int T, n;
srtr arr[maxn];
lli do_print[maxn];
void work_data(void)
{
memset(arr, 0, sizeof(arr));
memset(do_print, 0, sizeof(do_print));
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%lld", &arr[i].dat);
arr[i].pos = i;
}
sort(arr + 1, arr + 1 + n);
for (int i = 1; i <= n; i++)
if (arr[i].dat != arr[i - 1].dat)
do_print[arr[i].pos] = arr[i].dat;
// Printing
bool last_printed = false;
for (int i = 1; i <= n; i++)
if (do_print[i]) {
printf("%s%lld", last_printed ? " " : "", do_print[i]);
last_printed = true;
}
return ;
}
int main(int argc, char** argv)
{
scanf("%d", &T);
for (int idx = 1; idx <= T; idx++)
work_data();
return 0;
}
Source Code
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <set>
using namespace std;
typedef long long lli;
int T, n;
int main(int argc, char** argv)
{
scanf("%d", &T);
for (int idx = 1; idx <= T; idx++) {
scanf("%d", &n);
set<lli> st;
lli x; scanf("%lld", &x);
st.insert(x);
printf("%lld", x);
for (int i = 2; i <= n; i++) {
lli x; scanf("%lld", &x);
if (st.find(x) != st.end())
continue;
st.insert(x);
printf(" %lld", x);
}
printf("\n");
}
return 0;
}