关闭

HDU 5821 Ball(贪心)

172人阅读 评论(0) 收藏 举报
分类:

Description
给两个长度为n的序列a和b,m次操作,每次操作可以把a序列区间[l,r]中的数重排,问经过m次操作后a序列是否能够变成b序列
Input
第一行一整数T表示用例组数,每组用例首先输入两整数n和m分别表示序列长度和操作数,之后两行每行n个整数分别表示a序列和b序列,最后m行每行两个整数l,r表示该次操作可以操作的区间
(1<=n<=1000,0<=m<=1000,0<=ai,bi<=1000,1<=l<=r<=1000)
Output
对于每组用例,如果a序列经过m次操作变成b序列则输出Yes,否则输出No
Sample Input
5
4 1
0 0 1 1
0 1 1 1
1 4
4 1
0 0 1 1
0 0 2 2
1 4
4 2
1 0 0 0
0 0 0 1
1 3
3 4
4 2
1 0 0 0
0 0 0 1
3 4
1 3
5 2
1 1 2 2 0
2 2 1 1 0
1 3
2 4
Sample Output
No
No
Yes
No
Yes
Solution
对于a序列的每个值,找到其在b序列中应处的位置pos[i],那么每次操作我们贪心的让每个元素更加接近其应处的位置,说白了就是sort下pos[l]~pos[r],最后判断排序完的a序列是否与b序列相等即可
Code

#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 1111
int T,n,m,b[maxn],vis[maxn];
pair<int,int>a[maxn];
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)scanf("%d",&a[i].second);
        for(int i=1;i<=n;i++)scanf("%d",&b[i]);
        memset(vis,0,sizeof(vis));
        for(int i=1;i<=n;i++)
        {
            a[i].first=-1;
            for(int j=1;j<=n;j++)
                if(b[j]==a[i].second&&!vis[j])
                {
                    a[i].first=j,vis[j]=1;
                    break;
                }
        }
        for(int i=1;i<=m;i++)
        {
            int l,r;
            scanf("%d%d",&l,&r);
            sort(a+l,a+r+1);
        }
        int flag=1;
        for(int i=1;i<=n;i++)
            if(a[i].second!=b[i])
            {
                flag=0;
                break;
            }
        printf("%s\n",flag?"Yes":"No"); 
    }
    return 0;
}
0
0
查看评论

HDU 5821 Ball(贪心)

Ball Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 138  ...
  • Yasola
  • Yasola
  • 2016-08-11 19:18
  • 264

[HDU 5821] Ball (贪心)

HDU - 5821 给定一列球,每种球有一个颜色,同一颜色的球无区别 每次选择一个区间,任意排列其中的球 问是否能从初始的排列变成给定的一个排列 首先有一个很重要的性质,就是同种颜色的球 最终排列的相对顺序是不变的 也就是说,颜色为 1的第一个球,最后还是在同类球的第一个 预...
  • u012015746
  • u012015746
  • 2016-08-11 19:25
  • 259

HDU 5821 Ball ( 贪心)

http://acm.hdu.edu.cn/showproblem.php?pid=5821Problem DescriptionZZX has a sequence of boxes numbered 1,2,…,n. Each box can contain at most one ball.Y...
  • Codeblocksm
  • Codeblocksm
  • 2016-08-12 14:36
  • 327

贪心(Ball,HDU 5821)

又是很多人都做出来了的题目,自己却没有做出来。 主要是思维上的障碍。 一方面自己应该想好了再来写。 确定好时间复杂度,正确性,编码复杂度。有一定把握了再来写代码。 一开始想了个大概,然后开始写,一边写一边想,代码的讨论很复杂,写完后自己的数据过不了,改了很久,然后感觉讨论不清...
  • xl2015190026
  • xl2015190026
  • 2017-07-25 19:36
  • 119

HDU 5821 Ball 贪心

传送门:HDU5821 题意:有N个盒子,每个盒子最多装一个球. 球的颜色不一定相同.现在要进行m次区间操作: 每次操作将[l, r]区间内的球拿出来后,再随意将区间内的球重新分配回去. 问经过上述操作后是否有可能达到给定的状态. 思路:先贪心的给每个球在b数组中找个位置,然后每次选一个区间...
  • lxy767087094
  • lxy767087094
  • 2017-09-12 00:24
  • 63

HDU 5821 Ball (贪心)

http://acm.hdu.edu.cn/showproblem.php?pid=5821 把区间里的数字随便改变位置,问m次操作之后a数组能不能得到b数组。 这题应该是贪心,开头的想法是把a数组操作的区间排序,然后b数组操作的也去排序,然后看是否相同,但是这样就错了。因为b数组,排序之后就会...
  • Miracle_ma
  • Miracle_ma
  • 2016-08-12 13:30
  • 235

HDU 5821 Ball【贪心】

Ball Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1083  ...
  • Puyar_
  • Puyar_
  • 2017-07-19 18:18
  • 94

hdu 5821 Ball 贪心(多校)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5821 题意: 有N个盒子,每个盒子最多装一个球. 球的颜色不一定相同. 现在要进行m次区间操作: 每次操作 [l, r] 后可以随意将区间内的球重新分配回去. 问经过上述操作后是否有...
  • hjt_fathomless
  • hjt_fathomless
  • 2016-08-11 23:01
  • 188

hdu 5821 Ball 贪心+思维

题目链接 题意:T组数据,每组给定一个n一个m,在给定两个长度为n的数组a和b,再给定m次操作,每次给定l和r,每次可以把[l,r]的数进行任意调换位置,问能否在转换后使得a数组变成b数组。 思路:我一直在纠结如果有多个颜色相同的颜色,那么该求应该优先放在B数组的哪个位置啊,会不会有后效性啥...
  • HowardEmily
  • HowardEmily
  • 2017-09-12 00:24
  • 92

HDU 5821 Ball 贪心+映射

题目链接:HDU5821 Ball Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): ...
  • qq_29480875
  • qq_29480875
  • 2016-08-13 02:47
  • 127
    个人资料
    • 访问:556586次
    • 积分:24581
    • 等级:
    • 排名:第313名
    • 原创:1943篇
    • 转载:0篇
    • 译文:0篇
    • 评论:69条
    最新评论