码迷,mamicode.com
首页 > 其他好文 > 详细

poj2182 逆推暴力

时间:2018-09-04 10:31:42      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:names   ace   freopen   int   using   include   --   i++   pen   

题意

告诉有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();
}

 

poj2182 逆推暴力

标签:names   ace   freopen   int   using   include   --   i++   pen   

原文地址:https://www.cnblogs.com/zi-qilin/p/9582424.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!