BitComet 旗下网站

转到日志
相关贴吧:
acm of zju

zju1201 前后转换

楼主 发表于:2008-09-11 17:49:18 [回复]

/*Inversion  

 2008-09-08 22:49:35 Accepted 1201 C++ 00:00.00 836K 天将降大任于我     

 当P序列转换为I序列时, i前有多少个比其大的数,则下标为i的位置填该数,即得到以I开头的序列。以I开头的序列转换成P开头的序列则是,位置为i的数表示的是:在P序列中,数字i前面有多少个比它大的数,即得到P序列
当输入为cin时,chaar字符型数据可以用比较形式if(c=='I'),不需要用strcmp()函数
*/
#include<iostream>
using namespace std;
const int N=50;
int p[N+1],I[N+1],s[N+1];
int main()
{
 int n,i,j,num;char  c;
 while(cin>>n&&n)
 {  memset(s,0,sizeof(s));
    memset(p,0,sizeof(p));
   cin>>c;
  for(i=0;i<n;i++)
  cin>>p[i];
  if(c=='P')
  {
   for(i=0;i<n;i++)        //检查前面是否有比它大的数,有多少个就加到多少个,num
   {   num=0;
    for(j=0;j<=i-1;j++)
     if(p[j]>p[i]) num++;
     s[p[i]]=num;        //然后将这个数作为下标存储num,作为I输出的第p[i]个数
   }
   for(i=1;i<n;i++) cout<<s[i]<<" ";
   cout<<s[n]<<endl;
  }
  else if(c=='I')              //当c为I时
  {  
   for(i=0;i<n;i++)
   {   num=0;
    for(j=1;;j++)
    {
     if(s[j]==0) num++;   //从一开始算起,一直找到p[i]个没有标记过的(标记过的都比它小),
     if(num==p[i]+1) break;      //则达到p[i]个的那个位置+1即为i+1所在位置
    }
    s[j]=i+1;
   }
      for(i=1;i<n;i++) cout<<s[i]<<" ";
  cout<<s[n]<<endl;
  }
 }
 return 0;
}


心难泰,世风坏,旧时正气今何在?正义寡,人情薄,闻道虽多,茅塞不开。怪!怪!怪! 空等待,几多载,冲出重围人心快!暴雨打,狂风袭,任他折磨,此志难改。耐!耐!耐!

 

您现在还没有登录,请在登录后发贴