CF 1896 A. Jagged Swaps 学习笔记
链接
传送门
代码
#include<bits/stdc++.h>
using namespace std;
const int N=20;
int a[N];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
if(a[1]==1) printf("yes\n");
else printf("no\n");
memset(a,0,sizeof a);
}
return 0;
}
总结
1.第一次写WA 2 ,代码如下
#include<bits/stdc++.h>
using namespace std;
const int N=20;
int a[N],b[N];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=a[i];
}
sort(b+1,b+1+n);
//for(int i=1;i<=n;i++) printf("%d ",b[i]);
for(int i=2;i<=n-1;i++)
{
if(a[i]>a[i-1]&&a[i]>a[i+1]) swap(a[i],a[i+1]);
}
bool flag=false;
for(int i=1;i<=n;i++)
{
if(a[i]!=b[i])
{
flag=true;
break;
}
}
if(flag==true) printf("no\n");
else printf("yes\n");
memset(a,0,sizeof a);
memset(b,0,sizeof b);
}
return 0;
}
//permutation 排列
//arbitrary 任意的
//modified 改变
//Hence 因此
//hold 包含
//pretend 假装
//Implementation 实施
错误思路是,每遇到一个a[i]>a[i-1]&&a[i]>a[i+1]的情况,就交换a[i]和a[i+1],但事实上不是这样的,我们是有选择的交换,而不是遇到一个交换一个
2.题目说的很清楚,给定一个排列,特意解释了一下排列的意思,比如说总的元素个数是3,元素就只会是1,2,3,我刚开始还以为只是这个题目数据范围比较小
3.a[i]>a[i-1]&&a[i]>a[i+1],i>=2&&i<=n-1,我们可以发现,第一个数字是无法移动的,所以第一个数字必须是数字1
4.有选择的进行交换操作:首先交换最大的数字,把最大的数字移动到排列的最后面,然后移动倒数第二大的数字,循环操作,直到排列完成,所以说只要第一个数字等于1,后面的数字都可以排列好,只需要判断第一个数字是否为1该题就可以解决