题解:洛谷 P10497 [USACO03Open] Lost Cows

原题链接

思路 + 算法

首先,考虑读入到 \(a_i\) 时,如果要得到此时的最优解(指所有牛的编号不重不漏地覆盖 \([1,i]\) 的所有编号),对于第 \(i\) 头奶牛,因为在它前面有 \(a_i\) 头奶牛的编号小于它,所以第 \(i\) 头奶牛的编号应当为 \(a_i+1\)

如果有一头新的奶牛 \(i+1\) 加入到这个奶牛序列,要使它的编号恰好为 \(a_{i+1}+1\),原来编号为 \(a_{i+1}+1\) 的奶牛就必须让编号 \(+1\) 来让出这个编号。同样,编号大于 \(a_{i+1}+1\) 的奶牛也必须跟着增加编号来维持前 \(i\) 头奶牛之间的相对关系。

那么我们的暴力算法就出现了:

每读入一个新的 \(\bf{a_i}\),就让它之前编号大于等于 \(\bf{a_i}\) 的奶牛的编号增加 \(\bf{1}\),最后再将第 \(\bf{i}\) 头奶牛的编号设置为 \(\bf{a_i+1}\)

最后输出所有奶牛的编号即可,注意第一头奶牛的编号要在输入前初始化为 \(1\)

时间复杂度 \(O(N^2)\)

AC 代码

#include<cstdio>
using namespace std;

const int N=1e5+5;
int n,a[N],ans[N];

int main()
{
	scanf("%d",&n);
	ans[1]=1;
	for(int i=2;i<=n;i++)
	{
		scanf("%d",&a[i]);
		for(int j=1;j<i;j++)
			if(ans[j]>a[i]) ans[j]++;
		ans[i]=a[i]+1;
	}
	for(int i=1;i<=n;i++)
		printf("%d\n",ans[i]);
	return 0;
}
posted @ 2024-09-01 08:26  Jerrycyx  阅读(12)  评论(0编辑  收藏  举报