• Most socially-distanced subsequence(贪心+思维)


    传送门


    一道原汁原味的贪心题目

    随心证明:

    对于连续的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;
    }
    
  • 相关阅读:
    多态
    封装
    继承
    面向对象
    2.机器学习相关数学基础
    作业1 机器学习概述
    作业15 语法制导的语义翻译
    作业14 算符优先分析
    作业13 自下而上语法分析
    作业12 实验二 递归下降语法分析
  • 原文地址:https://www.cnblogs.com/pureayu/p/14413474.html
Copyright © 2020-2023  润新知