zoukankan      html  css  js  c++  java
  • 1293: [SCOI2009]生日礼物

    Time Limit: 10 Sec  Memory Limit: 162 MB
    Submit: 3151  Solved: 1743
    [Submit][Status][Discuss]

    Description

    小西有一条很长的彩带,彩带上挂着各式各样的彩珠。已知彩珠有N个,分为K种。简单的说,可以将彩带考虑为x轴,每一个彩珠有一个对应的坐标(即位置)。某些坐标上可以没有彩珠,但多个彩珠也可以出现在同一个位置上。 小布生日快到了,于是小西打算剪一段彩带送给小布。为了让礼物彩带足够漂亮,小西希望这一段彩带中能包含所有种类的彩珠。同时,为了方便,小西希望这段彩带尽可能短,你能帮助小西计算这个最短的长度么?彩带的长度即为彩带开始位置到结束位置的位置差。

    Input

    第一行包含两个整数N, K,分别表示彩珠的总数以及种类数。接下来K行,每行第一个数为Ti,表示第i种彩珠的数目。接下来按升序给出Ti个非负整数,为这Ti个彩珠分别出现的位置。

    Output

    应包含一行,为最短彩带长度。

    Sample Input

    6 3
    1 5
    2 1 7
    3 1 3 8

    Sample Output

    3

    HINT

    有多种方案可选,其中比较短的是1~5和5~8。后者长度为3最短。
    【数据规模】
    对于50%的数据, N≤10000;
    对于80%的数据, N≤800000;
    对于100%的数据,1≤N≤1000000,1≤K≤60,0≤彩珠位置<2^31。

    先预处理一遍,按照彩珠位置顺序进行排序

    然后遍历彩珠,当符合条件时,更新一次答案,删取尾部的珠子,可以想象一条蚯蚓在蠕动

    最坏情况下时间复杂度为O(nk),感觉是要TLE的,但还是过了

     1 #include<iostream>
     2 #include<cstdio>
     3 #include<algorithm>
     4 using namespace std;
     5 
     6 #define LL long long
     7 const int MAXN=1000000+5;
     8 const int INF=0x7fffffff;
     9 
    10 struct Node
    11 {
    12     int x,w;
    13 }E[MAXN];
    14 int node;
    15 int n,k,ans=INF;
    16 int t[65];
    17 
    18 bool cmp(Node a,Node b)
    19 {
    20     return a.x<b.x;
    21 }
    22 
    23 bool check()
    24 {
    25     bool flag=1;
    26     for(int i=0;i<k;i++)
    27         if(!t[i])
    28         {
    29             flag=0;
    30             break;
    31         }
    32     return flag;
    33 }
    34 
    35 int main()
    36 {
    37     scanf("%d%d",&n,&k);
    38     for(int i=0;i<k;i++)
    39     {
    40         int t;
    41         scanf("%d",&t);
    42         for(int j=1;j<=t;j++)
    43         {
    44             int x;
    45             scanf("%d",&x);
    46             E[++node]=(Node){x,i};
    47         }
    48     }
    49     sort(E+1,E+node+1,cmp);
    50     int l=1,r=0;
    51     for(int i=1;i<=node;i++)
    52     {
    53         t[E[i].w]++;
    54         r++;
    55         while(check())
    56         {
    57             ans=min(ans,E[r].x-E[l].x);
    58             do{t[E[l].w]--,l++;}while(E[l-1].x==E[l].x);
    59         }
    60     }
    61     printf("%d
    ",ans);
    62     return 0;
    63 }
  • 相关阅读:
    201521044091《Java程序设计》第7周学习总结
    201521044091《java程序设计》第四次总结
    201521044091 《java程序设计》第八周学习总结
    201521044091 《Java程序设计》第5周学习总结
    201521044091 《Java程序设计》第2周学习总结
    201521044091 《Java程序设计》第3周学习总结
    MySQL设置字符集CHARACTER SET
    Create My MySQL configuration by Percona
    How to use jQuery to manipulate Cookies
    How to use OpenXml to import xml data to Sql server
  • 原文地址:https://www.cnblogs.com/InWILL/p/9706970.html
Copyright © 2011-2022 走看看