题解:洛谷 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;
}
本文采用 「CC-BY-NC 4.0」 创作共享协议,转载请注明作者及出处,禁止商业使用。
作者:Jerrycyx,原文链接:https://www.cnblogs.com/jerrycyx/p/18391001