这道题其实就是一个纸老虎(其实连纸老鼠都不是),
但是它却有一个超大的特点——————————那就是坑!!!
初读题时,会认为是个LIS,觉得直接从前面来一个,从后面来一个就行。
但是,提交上后会“惊喜”的发现超时了。
再细细品味时才发现原来就是个水爆了的题目:
本题的重点就在于这些木桩的位置其实是可以随意移动的,
那么这道题岂不是直接去重就行了!
去重后还剩下的元素个数便是本题答案了!
第一种做法:
数组 + unique函数去重
unique函数简单说就是将不重复元素推移到重复元素的位置上,要使用时前面必须把数组sort一下。
附上已AC代码
#include <bits/stdc++.h>//万能头文件(方便) using namespace std; int main() { int t,N,a[200000]; cin >> t; while (t--) { cin >> N; int i,j; for (i = 0;i < N;i ++) { cin >> a[i]; } sort(a,a + N);//前面必须排一下序 int m = unique(a,a + N) - a;//unique(a,a + N) - a返回去重后剩余元素个数 cout << m << endl;//去重后还剩下的元素个数便是本题答案了 } return 0; }
第二种做法
集合set极简版。
仔细想想,去重岂不是集合set的特性吗!
所以只需要将数据输入然后再输出元素个数就行了。
附上已AC代码(两种代码都提交过)
#include <bits/stdc++.h>//万能头文件(方便) using namespace std; int main() { int t; cin >> t; while (t--) { set<int> set_int;//定义一个set集合 int i,n; cin >> n; for (i = 0;i < n;i ++) { int x; cin >> x; set_int.insert(x);//直接用insert输入数据 } cout << set_int.size() << endl;//输出剩余元素个数(简便) } return 0; }