zoukankan      html  css  js  c++  java
  • HDU 5821 Ball (贪心)

    Ball

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)
    Total Submission(s): 1079    Accepted Submission(s): 648

    Problem Description
    ZZX has a sequence of boxes numbered 1,2,...,n. Each box can contain at most one ball.

    You are given the initial configuration of the balls. For 1in, if the i-th box is empty then a[i]=0, otherwise the i-th box contains exactly one ball, the color of which is a[i], a positive integer. Balls with the same color cannot be distinguished.

    He will perform m operations in order. At the i-th operation, he collects all the balls from boxes l[i],l[i]+1,...,r[i]-1,r[i], and then arbitrarily put them back to these boxes. (Note that each box should always contain at most one ball)

    He wants to change the configuration of the balls from a[1..n] to b[1..n] (given in the same format as a[1..n]), using these operations. Please tell him whether it is possible to achieve his goal.
     
    Input
    First line contains an integer t. Then t testcases follow. 
    In each testcase: First line contains two integers n and m. Second line contains a[1],a[2],...,a[n]. Third line contains b[1],b[2],...,b[n]. Each of the next m lines contains two integers l[i],r[i].

    1<=n<=1000,0<=m<=1000, sum of n over all testcases <=2000, sum of m over all testcases <=2000.

    0<=a[i],b[i]<=n.

    1<=l[i]<=r[i]<=n.
     
    Output
    For each testcase, print "Yes" or "No" in a line.
     
    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
     
    Author
    学军中学
    Source
     

    题意:

    有N个盒子,每个盒子最多装一个球. 球的颜色不一定相同.
    现在要进行m次区间操作:
    每次操作 [l, r] 后可以随意将区间内的球重新分配回去.
    问经过上述操作后是否有可能达到给定的状态.

    题解:

    贪心.
    为每个球标记它在最终结果中的序号. 对于颜色相同的球:左边的尽量分配小的序号.
    对于m次区间操作,就将区间[l,r]中的球按最终序号排序.
    每次排序都相当于让区间中的球向它们的最终位置更近一步.
    最终再比较是否每个球都到位即可.

    #include<stdio.h>
    #include<iostream>
    #include<string.h>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int maxn=1111;
    int t;
    int n,m;
    int flag;
    struct node
    {
        int next;
        int color;
    }a[maxn];
    int cmp(node a,node b)
    {
        return a.next<b.next;
    }
    int l,r;
    int b[maxn];
    int main()
    {
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&m);
            for(int i=0;i<n;i++)
            {
                scanf("%d",&a[i].color);
                a[i].next=-1;
            }
            for(int i=0;i<n;i++)
            {
                scanf("%d",&b[i]);
                for(int j=0;j<n;j++)
                {
                    if(b[i]==a[j].color&&a[j].next==-1)
                    {
                        a[j].next=i;
                        break;
                    }
                }
            }
            for(int i=0;i<m;i++)
            {
                scanf("%d%d",&l,&r);
                sort(a+l-1,a+r,cmp);
            }
            flag=1;
            for(int i=0;i<n;i++)
            {
                if(a[i].color!=b[i])
                {
                    flag=0;
                    break;
                }
            }
            if(flag)printf("Yes
    ");
            else printf("No
    ");
        }
        return 0;
    }
  • 相关阅读:
    八数码难题 (codevs 1225)题解
    小木棍 (codevs 3498)题解
    sliding windows (poj 2823) 题解
    集合删数 (vijos 1545) 题解
    合并果子 (codevs 1063) 题解
    等价表达式 (codevs 1107)题解
    生理周期 (poj 1006) 题解
    区间 (vijos 1439) 题解
    区间覆盖问题 题解
    种树 (codevs 1653) 题解
  • 原文地址:https://www.cnblogs.com/stepping/p/7204506.html
Copyright © 2011-2022 走看看