首页 > 其他分享 > [NOIP2018 提高组] 铺设道路 贪心证明

[NOIP2018 提高组] 铺设道路 贪心证明

时间:2022-10-14 20:45:22浏览次数:55  
标签:... ch int NOIP2018 铺设 序列 cases 贪心

首先,这个是本蒟蒻第一次正经证明贪心,方法肯定有些繁琐(知识有限),仅作纪念。

证明:

  • 记\(f(x)\)为序列中从第\(1\)到第\(x\)个数满足题意的最小天数。
    对于非上升序列\(\{a_1,a_2,a_3,...,a_n\}\)

\[f(1)=a_1,f(2)=a_2+(a_1-a_2)=a_1,f(3)=a_3+(a_2-a_3)+[a_1-a_3-(a_2-a_3)]=a_1 \]

故猜测$$f(x)=a_x+(a_{x-1}-a_x)+[a_{x-2}-a_x-(a_{x-1}-a_x)]+...=a_1$$

\[g(x)=\begin{cases}a_x-g(x+1)-g(x+2)-...&x\leqslant n\\0&x>n\end{cases} \]

\(\therefore f(x)=\sum\limits_{i=1}^ng(i)=a_1-g(2)-g(3)-...-g(n-1)-g(n)+g(2)+g(3)+...+g(n-1)+g(n)=a_1\)

  • 对于非上升序列\(\{a_1,a_2,a_3,...,a_n\}\),加入一个元素\(a_{n+1}>a_n\)得\(\{a_1,a_2,a_3,...,a_n,a_{n+1}\}\)
    同上处理第一步得 \(\{a_1-a_n,a_2-a_n,a_3-a_n,...,0,a_{n+1}-a_n\}\)
    对此\(f(n)=a_1-a_n\)
    \(\therefore f(n+1)=f(n)+a_{n+1}-a_n\)

  • 第二点中得到的新序列等价于一个非上升序列(首元素为\(a_1\),尾元素为\(a_{n+1}\)),那么此后的处理任然按第一或二点实行,始终保持一个非上升序列。所以得出:

\[f(x)=\begin{cases}f(x-1)&a_x\leqslant a_{x-1}\\f(x-1)+a_x-a_{x-1}&a_x>a_{x-1}\end{cases} \]

感觉还可以用递推做(。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
namespace IO{
	char ibuf[(1<<20)+1],*iS,*iT;
	#if ONLINE_JUDGE
	#define gh() (iS==iT?iT=(iS=ibuf)+fread(ibuf,1,(1<<20)+1,stdin),(iS==iT?EOF:*iS++):*iS++)
 	#else
	#define gh() getchar()
	#endif
	#define reg register
	inline long long read(){
		reg char ch=gh();
		reg long long x=0;
		reg char t=0;
		while(ch<'0'||ch>'9')   t|=ch=='-',ch=gh();
		while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=gh();
		return t?-x:x;
	}
}
using IO::read;//辟邪の代码
const int N=100000+10, INF=0x3f3f3f3f;
int n;
int a[N];
int maxn;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	maxn=a[1];
	for(int i=2;i<=n;i++){
		if(a[i]>a[i-1]){
			maxn+=(a[i]-a[i-1]);
		}
	}
	cout<<maxn<<endl;
	return 0;
}
/*
今天你AC了几题?
不要颓废!!!!
Dalao has AKed IOI several times!!!
*/

标签:...,ch,int,NOIP2018,铺设,序列,cases,贪心
From: https://www.cnblogs.com/FaceLuck/p/16792943.html

相关文章

  • AtCoder Regular Contest 150 B Make Divisible 贪心 整除分块
    给出一个A和B想要找到一个X和Y使得\(A+X|B+Y\).同时使得X+Y最小求出X+Y的最小值。值域是\([1,10^9]\)直接枚举X不太行会被某种数据卡掉。考虑正解:先固定K另\(\frac{B......
  • 贪心算法初讲1
     2.1.1贪心的基本思想:“只顾眼前”保证局部最优;贪心的特点:1.步步最优2.进行贪心策略的选择时要经过数学证明3.算法简单,选择一但做出不可回溯;   ......
  • 学一下贪心算法
    贪心算法思想在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。特征1、贪心选择性质  一......
  • 大根堆+贪心算法
    前篇文章使用贪心算法求可达到最远建筑,还存在一些问题,只能取局部最优解。大根堆+贪心算法神偷Jacky身上带着一堆砖头和可以无限伸缩的梯子在楼顶穿梭。如果遇到下一......
  • Insert a Progression (观察+贪心贡献, 两两数的绝对值差之和)
    题目大意: 给出一个数组A,然后一个1到x的所有数,让你把这些数插入到A里面,使得插入后的序列ai和ai+1绝对值差的和最小,求出这个最小值即可思路: 要素......
  • Leetcode 11 -- 贪心
    题目描述最小字典许思路思路来源由于t中的字符后进先出,可以使用一个暂存栈来保存s删除的第一个字符入栈很简单,初始状态下,栈为空,我们可以直接入栈,因此,每次遍历我们......
  • Leetcode 11 -- 双指针&&贪心
    题目说明盛水最多的容器题目要求我们找出两个边界\(L\)和\(R\),使得容量:\(min(right[L],right[R])*(R-L)\)的值最大。思路算法不是玄学。首先,两层for循......
  • 关于贪心策略的一些小trick
    为什么要写这种如此简单的东西呢就是因为菜啊首先给出关于贪心的三个定义符合贪心选择的特性(GreedyChoiceProperty)我们需要证明我们的第一个选择(贪心选择GreedyCho......
  • CF1415D XOR-gun 题解 二分答案/贪心
    题目链接https://codeforces.com/problemset/problem/1415/D题目大意给定一个长为\(n\)的不降序列,每次操作可以任选相邻的两个数,并将这两个数替换为两个数按位异或的......
  • 反悔贪心
    一.什么是反悔贪心顾名思义,反悔贪心就是两个操作:“反悔”+“贪心”。一般来说,贪心仅能解出局部最优解。那么在要求全局最优解时,我们就可以利用“反悔”这个操作解决。......