作者:xq的acm之路
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=56
题目大意:给你一串数字,按照一个规则从小到大排序,规则是:你只能选择一个位置,然后把这个位置以上的全部数字反过来。
思路:先把所有的数字排序,然后从后往前扫,如果不是排序后的位置,则往前找,找到了,如果不是在0位置,那么,把它先翻到0位置,然后再整体翻回来。
输入的时候犯了一个错,把两位数字忘了,注意一下就ok了,不是很难,,,
代码如下:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
char c[60];
int a[30],b[30],e[30];
while(gets(c))
{
int l=0,d;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(e,0,sizeof(e));
puts(c);
int x=strlen(c),sum=0;
for(int i=0; i<x; i++)
{
if('0'<=c[i]&&c[i]<='9')
{
sum=sum*10+c[i]-'0';
}
else
{
a[l++]=sum;
sum=0;
}
}
a[l++]=sum;
for(int i=0; i<l; i++)
b[i]=a[i];
sort(b,b+l);
for(int i=l-1; i>=0; i--)
{
for(int j=0; j<l; j++)
{
if(a[j]==b[i])
{
d=j;
break;
}
}
if(d!=i)
{
if(d!=0)
{
cout<<l-d<<" ";
for(int k=0; k<=d; k++)
{
e[k]=a[k];
}
for(int k=0; k<=d; k++)
{
a[k]=e[d-k];
}
}
cout<<l-i<<" ";
for(int k=0; k<=i; k++)
{
e[k]=a[k];
}
for(int k=0; k<=i; k++)
{
a[k]=e[i-k];
}
}
else
continue;
}
cout<<"0"<<endl;
}
return 0;
}