题意:把a数组末尾的数放到b数组中间,直到a数组变空;再把b数组中间的数放到c数组末尾,直到b数组变空。
题解:想象一下把数从a拿到b里再拿到c里的过程——从末尾拿的那个数放到b里,再拿倒数第二个到b里,它可以选择到一开始放进去的那个数的左边或是右边,假设这两个数第一层(因为后面的数都要放到他们两个中间);然后是倒数第三个数,放到前两个放进去的数之间,放倒数第四个数,同样,它可以选择在倒数第三个数的左边或是右边,这两个数组成第二层;......;从b里拿数的过程也是如此一层一层的选两个那一层中的两个数谁先出来(如果是奇数个数 b数组中间一层只有一个数 这个数也就是最后放进b数组的那个a数组的第一个数,他也是第一个被从b数组里面拿出来的)so,一套操作下来,a数组中,只有倒数第一个数和倒数第二个数,倒数第三个数和倒数第四个数,倒数第五个数和倒数第六个数.....这些位置的数字被相互交换。
代码和思路分别来源于:
(37条消息) Codeforces Round #786 (Div. 3)(A—E题解)_花落的那一天的博客-CSDN博客
(38条消息) Codeforces Round #786 (Div. 3) 题解_T_Y_F666的博客-CSDN博客
#include <iostream>
#include <algorithm>
#include <string.h>
#include <math.h>
#include <ctype.h>
using namespace std;
int a[1000010];
int main()
{
int t,n;
cin>>t;
while(t--)
{
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=n-2;i>=0;i-=2)
{
if(a[i+1]<a[i])
swap(a[i+1],a[i]);
//按照左边的数不大于右边的数的原则
//进行交换或是不交换
}
if(is_sorted(a,a+n))
cout<<"YES"<<endl;
else cout<<"NO"<<endl;
//该函数包括在<algorithm>里,会返回一个 bool 类型值,
//如果数组按照非降序排列返回true,反之返回false
}
return 0;
}
在OJ可以AC,但在Dv编译器上是这样说的:[Error] 'is_sorted' was not declared in this scope
我查了,但是不得而终,求大佬指点
浙公网安备 33010602011771号