题意
告诉有n头牛,每头牛有一个编号1~n,再一次烂醉之后,奶牛们没有按照编号排队;告诉你对于第i头奶牛,在它之前有多少头奶牛比它的编号小(i>1,因为第1头奶牛的数据永远为0,故题中省略),求每头奶牛的编号
从后往前推,对于第 i 头奶牛,所给数据 num[ i ] 表示它在前 i 头奶牛中排名第 numj[ i ]+1;又由于第 n 头奶牛的数据表示它在所有 n 头奶牛中排名第num[ i ]+1,故可求出第 n 头奶牛的编号;同理,在求出第 n 头奶牛的编号后,第 n-1 头奶牛的数据 num [ i ]表示在除第 n 头奶牛外的所有奶牛中排名第 num [ i ]+1 ,又因为第 n 头奶牛的排名已求出,由此可推出第 n-1 奶牛的排名;
代码实现如下
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
using namespace std;
namespace zi_qilin
{
const int maxn=+;
int n;
int a[maxn],ans[maxn];
vector<int> cow;
inline int read()
{
char c;while(scanf("%c",&c)&&!isdigit(c)) ;
int x=c-'';while(scanf("%c",&c)&&isdigit(c)) x=x*+c-'';
return x;
}
inline int work()
{
n=read();a[]=;
for(int i=;i<=n;i++) a[i]=read();
for(int i=;i<=n;i++) cow.push_back(i); //初始化i头奶牛的编号
for(int i=n;i>=;i--)
{
ans[i]=cow[a[i]]; // ans[i]表示第 i 头奶牛的编号,就是在vector剩余的编号中排名第a[i]的(vector从0开始下标,故此处未+1)
cow.erase(cow.begin()+a[i],cow.begin()+a[i]+);// 在此头牛的编号被求出后,从vector中删去,下一头奶牛i-1在此操作后即可直接通过下标查找到除此奶牛外排名第
// num[i-1]+1的编号
}
for(int i=;i<=n;i++) printf("%d\n",ans[i]);
} }
int main()
{
//freopen("try.in","r",stdin);
return zi_qilin::work();
}