一道原汁原味的贪心题目
随心证明:
对于连续的K个数字(假设k = 3),如果这三个是递增或者递减的,那么|a1 - a2| + |a2 - a3|就是 |a1 - a3|,也就是说,对于连续单调的一个数列,只需要取首和尾就可以了,中间的都是多余项。
还有一点就是第一个数字和最后一个都要算上。
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int a[N], b[N];
vector<int> vec;
void solve(){
vec.clear();
int n, ver = 0;
cin >> n;
for(int i = 1; i <= n; i ++)
cin >> a[i];
b[++ ver] = a[1];
for(int i = 2; i <= n; i ++)
if(a[i] != a[i - 1])
b[++ ver] = a[i];
vec.push_back(a[1]);
for(int i = 2; i < ver; i ++)
if(b[i] > b[i - 1] && b[i] > b[i + 1] || b[i] < b[i - 1] && b[i] < b[i + 1])
vec.push_back(b[i]);
vec.push_back(b[ver]);
cout << vec.size() << endl;
for(int i = 0; i < vec.size(); i ++)
cout << vec[i] << ' ';
cout << endl;
}
int main(){
ios::sync_with_stdio(false);
int t;
cin >> t;
while(t --){
solve();
}
return 0;
}