poj2182 逆推暴力
题意
告诉有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=8000+100; int n; int a[maxn],ans[maxn]; vector<int> cow; inline int read() { char c;while(scanf("%c",&c)&&!isdigit(c)) ; int x=c-'0';while(scanf("%c",&c)&&isdigit(c)) x=x*10+c-'0'; return x; } inline int work() { n=read();a[1]=0; for(int i=2;i<=n;i++) a[i]=read(); for(int i=1;i<=n;i++) cow.push_back(i); //初始化i头奶牛的编号 for(int i=n;i>=1;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]+1);// 在此头牛的编号被求出后,从vector中删去,下一头奶牛i-1在此操作后即可直接通过下标查找到除此奶牛外排名第
// num[i-1]+1的编号
}
for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
}
}
int main()
{
//freopen("try.in","r",stdin);
return zi_qilin::work();
}