Problem I Inverted Deck

Problem I Inverted Deck_第1张图片
Problem I Inverted Deck_第2张图片
思维题:暴力做,先放一下题解
Problem I Inverted Deck_第3张图片
说一下自己的想法,当时想复杂了,而且也不知道swap函数,反正就是子串的两边做标记,然后交换,和原来排好顺序的串作比较,看看试试相同,是输出下标,不是输出impossible。

#include
using namespace std;
const int maxx = 1e6+7;
int a[maxx];
int b[maxx];
int main()
{
	int n;
	int count1=0,count2=0;//初始化很重要,为的是满足无打乱顺序串,当然值也可以不为零
	cin>>n;
	for(int i=0;i<n;i++)
    {
	    cin>>a[i];
    	b[i]=a[i];
    }
	sort(b,b+n);
	for(int i=0;i<n;i++)//左边标记
	{
		if(a[i]!=b[i])
		{
			count1=i;
			break;
		}
	}
	for(int i=n-1;i>=0;i--)//右边标记
	{
		if(a[i]!=b[i])
		{
			count2=i;
			break;
		}
	}
	for(int i=count1,j=count2;i<=j;i++,j--)//按情况交换为顺序串
	    swap(a[i],a[j]);
	bool flag=true;
	for(int i=0;i<n;i++)
	{
		if(a[i]!=b[i])//发现有不同的,跳出
		{
			flag=false;
			break;
		}
	}
	if(flag) printf("%d %d",count1+1,count2+1);
	else printf("impossible");
	return 0;
}

你可能感兴趣的:(ACM)