cf--contest1311--B. WeirdSort+冒泡排序

传送门

http://codeforces.com/contest/1311/problem/B

题意

有一个n个整数的数组,随后给出m个整数p,p是一个操作位置,也就是可以将数组中的第p个数和第p+1个数交换,一个p数可以使用多次,最后使得数组成为升序。

思路

由于数据量不是很大,可以用个二维数组+冒泡排序来解决这个题,用二维数组vis[i][j]表示i位置和j位置的交换。最后加一个冒泡排序即可。

AC代码
#include
#include
#include
using namespace std;
const int MAXN=105;
int a[MAXN],b[MAXN];
bool vis[MAXN][MAXN];
int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		memset(vis,false,sizeof(vis));
		int n,m;
		scanf("%d%d",&n,&m);
		for(int i=1;i<=n;i++)	scanf("%d",&a[i]),b[i]=a[i];
		sort(b+1,b+n+1);
		for(int i=1;i<=m;i++)
		{
			int p;
			scanf("%d",&p);
			vis[p][p+1]=true;
		}
		for(int i=n;i>=1;i--)
		{
			for(int j=1;j<i;j++)
			{
				if(a[j]>a[j+1] && vis[j][j+1])	
				swap(a[j],a[j+1]);
			}
		}
		int flag=1;
		for(int i=1;i<=n;i++)
			if(a[i]!=b[i]) flag=0;
		if(flag)	puts("YES");
		else	puts("NO");
	}
	return 0;
}

你可能感兴趣的:(算法刷题库)