您的位置:首页 > 其它

hdu 5821 Ball 贪心+思维

2017-09-12 00:24 483 查看
题目链接

题意:

T组数据,每组给定一个n一个m,在给定两个长度为n的数组a和b,再给定m次操作,每次给定l和r,每次可以把[l,r]的数进行任意调换位置,问能否在转换后使得a数组变成b数组。

思路:

我一直在纠结如果有多个颜色相同的颜色,那么该求应该优先放在B数组的哪个位置啊,会不会有后效性啥的.

其实不然,仔细一想会发现因为每个球最后还是呆在操作当中所能到达的区间里,如果某个操作可以完成,那么一定存在一种方法使得相同颜色的球的相对位置不变。这个过程需要自己好好理解

所以我们将a中的小球对应b中最后的位置,如果颜色相同就贪心的从左往右就好了.每次操作就是对a的小球按下标进行升序排序.最后从头遍历a是否出现在了b中自己该出现的位置就好了.

#include<bits/stdc++.h>

using namespace std;
const int maxn = 1e3+5;
int b[maxn];
struct node
{
int num,id;
bool operator<(const node & w) const
{
return id < w.id;
}
}a[maxn];
int n,m;
int main()
{
int _;
cin>>_;
while(_--)
{
scanf("%d %d",&n,&m);
for(int i = 1;i <= n;++i)
{
scanf("%d",&a[i].num);
a[i].id = -1;
}
for(int i = 1;i <= n;++i)
{
scanf("%d",&b[i]);
for(int j = 1;j <= n;++j)
{
if(a[j].id != -1) continue;
if(a[j].num == b[i])
{
a[j].id = i;
break;
}
}
}
while(m--)
{
int l,r;
scanf("%d %d",&l,&r);
sort(a+l,a+1+r);
}
bool flag = 0;
for(int i = 1;i <= n;++i)
{
if( b[i] != a[i].num)
{
flag = 1;
break;
}
}
if(!flag)
puts("Yes");
else
puts("No");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: