ZOJ1201 Inversion

9 篇文章 0 订阅

这几天是暑假,女友准备去法国,所以很多事情要处理,没有什么时间做题。这条题permutation到inversion 比较简单,但是inversion 到permutation有点难度。因为是分开两天来完成的,所以代码写得有点乱。大家可以根据我的代码来思考从inversion 到permutation的方法。

/*******************************************************************************
 * Author : Neo Fung
 * Email : neosfung@gmail.com
 * Last modified : 2011-07-25 19:36
 * Filename : ZOJ1201 Inversion.cpp
 * Description : http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1201
 * *****************************************************************************/
// ZOJ1201 Inversion.cpp : Defines the entry point for the console application.
//

// #include "stdafx.h"



#include <fstream>
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <string>
#include <vector>
#include <stack>
#include <deque>
#include <map>
#include <math.h>
#include <algorithm>
#include <numeric>
#include <functional>
#include <memory.h>

using namespace std;



void p2i(int n)
{
	vector<int> myVec;
	vector<int> result;
	vector<int>::iterator iter;
	int temp;
	int count;

	for(int i=0;i<n;++i)
	{
		cin>>temp;
		myVec.push_back(temp);
	}
	for(int i=1;i<=n;++i)
	{
		count=0;
		for(iter = find(myVec.begin(),myVec.end(),i);iter>=myVec.begin();--iter)
		{
			if(*iter>i) ++count;
		}
		result.push_back(count);
	}

	for(iter = result.begin();iter!=result.end();++iter)
		if (iter !=result.begin())
		{
			cout<<' ' <<*iter;
		}
		else
			cout<<*iter;
	cout<<endl;
}

void i2p(int n)
{
	vector<int> myvec;
	vector<int> result;
	vector<int>::iterator iter;
	vector<int>::iterator insertIter;
	int temp;
// 	int k;
	
	for(int i=0;i<n;++i)
	{
		cin>>temp;
		myvec.push_back(temp);
	}

	for(int i=0;i<=n;++i)
	{
		for(int j=0;j<n;++j)
		{

			if(myvec.at(j)==i)
			{

				if (!i)
				{
					result.push_back(j+1);
				} 
				else
				{
					int count(i);
					for (iter = result.begin();iter!=result.end();++iter)
					{
						if (*iter > j+1 )
						{
							--count;
						}
						if (count==0)
						{
							insertIter = iter+1;
						}
						if (myvec.at(*iter-1)==i)
						{
							insertIter = iter+1;
						}
					}
					result.insert(insertIter,j+1);
				}
			}
		}
	}
	for(iter = result.begin();iter!=result.end();++iter)
		if (iter !=result.begin())
		{
			cout<<' ' <<*iter;
		}
		else
			cout<<*iter;
	cout<<endl;
}

int main(void)
{
	int n;
	char ch;
	while(cin>>n && n)
	{
		cin>>ch;
		if (ch == 'P')
		{
			p2i(n);
		} 
		else
		{
			i2p(n);
		}
	}


	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值