zoukankan      html  css  js  c++  java
  • FZU Problem 2136 取糖果

     Problem 2136 取糖果

    Time Limit: 1000 mSec    Memory Limit : 32768 KB

     Problem Description

    有N个袋子放成一排,每个袋子里有一定数量的糖果,lzs会随机选择连续的几个袋子,然后拿走这些袋子中包含最多糖果的袋子。现问你,在选择x个袋子的情况下,lzs最坏情况下,也就是最少会拿到多少个糖果?对于x取值为1到n都分别输出答案。

     Input

    第一行一个整数T,表示有T组数据。

    每组数据先输入一行一个整数N(1<=N<=100000),表示袋子数,接下来一行输入N个正整数,输入的第i个数表示第i个袋子所装的糖果数。

     Output

    每组数据输出n行,第i行表示lzs随机取连续的i个袋子时的最坏情况下能拿到的糖果数。

     Sample Input

    1 5 1 3 2 4 5

     Sample Output

    1 3 3 4 5

     参考  :  http://www.cnblogs.com/luotinghao/archive/2013/11/11/3418047.html

    题意有点绕...大概就是对于一个d,取一段连续的d个数,然后从中选择最大的。现考虑所有长度为d的子段,问这些段数中最大的数中的最小的数是什么。对于d取值为1到n都要输出答案。
    首先按从小到大的顺序排序, 依次删除, 删除前查看下,这个点的范围域, 即左右共删除了几个,
    设 d = 删除的点数+本身为范围域, 假如d以前没更新过,  则连续取d的最坏值(暂时)为这个点的值
    例如样例: 1 3 2 4 5
     
    从小到大删除点, 先删除最小点, 以下标记黄色:
           1   3   2   4   5
    左右都没删东西, d=1 所以连续取1个最坏值为1, 接下来删除2
       1   3   2   4   5
    d=1 因为已经更新过, 更新为2的话肯定比原来的大了, 不是最坏值, 所以不更新, 再删除3
           1   3   2   4   5
    d=3 所以连续取3个的最坏值为3, 再删除4
           1   3   2   4   5
    d=4 所以连续取4个的最坏值为4, 最后删除5
       1   3   2   4   5
    d=5 所以连续取5个的最坏值为5  
     
    最后从后往前for一遍, 使连续d+1个的值大于等于连续d个的值
     
    中间操作, 可以借助链表的结构
     
     
    #include <iostream>
    #include <stdio.h>
    #include <queue>
    #include <stdio.h>
    #include <string.h>
    #include <vector>
    #include <queue>
    #include <set>
    #include <algorithm>
    #include <map>
    #include <stack>
    #include <math.h>
    #define Max(a,b) ((a)>(b)?(a):(b))
    #define Min(a,b) ((a)<(b)?(a):(b))
    using namespace std;
    typedef long long LL ;
    const int Max_N = 100018  ;
    int N ;
    int ans[Max_N]  ;
    struct List{
        int Left ;
        int Right  ;
    };
    
    struct Node{
        int  num  ;
        int  id ;
        friend  bool operator < (const Node A ,const Node B){
             return  A.num < B.num  ;
        }
    };
    
    List lis[Max_N] ;
    Node node[Max_N]  ;
    bool is_delete[Max_N]  ;
    
    int find_Left(int id){
       if(is_delete[id]==0)
           return id ;
       else
           return  lis[id].Left = find_Left(lis[id].Left)  ;
    }
    
    int find_Right(int id){
       if(is_delete[id]==0)
           return id ;
       else
           return  lis[id].Right = find_Right(lis[id].Right)  ;
    }
    
    int main(){
       int T  ;
       scanf("%d",&T) ;
       while(T--){
           scanf("%d",&N)  ;
           fill(is_delete,is_delete+5+N,0) ;
           fill(ans,ans+5+N ,-1) ;
           for(int i=1 ; i <= N ; i++){
                scanf("%d",&node[i].num)  ;
                lis[i].Left = i-1 ;
                lis[i].Right = i+1 ;
                node[i].id = i ;
           }
           sort(node+1,node+1+N)  ;
           for(int i = 1 ;i <= N ; i++){
               int id = node[i].id  ;
               int L = find_Left(lis[id].Left) ;
               int R = find_Right(lis[id].Right) ;
               int continue_num = R-L-1 ;
               if(ans[continue_num] == -1)
                   ans[continue_num] = node[i].num  ;
               is_delete[id] = 1 ;
           }
           for(int i= N-1 ; i >= 1 ; i--){
               if(ans[i] == -1 || ans[i]>ans[i+1])
                  ans[i] = ans[i+1]  ;
           }
           for(int i = 1 ; i <= N ; i++)
              printf("%d
    ",ans[i]) ;
       }
       return  0 ;
    }
  • 相关阅读:
    Webpack 入门指迷--转载(题叶)
    浏览器工作原理理解
    Knockout.js初体验
    node.js链接mysql
    2020年度春季学习总结--第二周
    Python 爬取 热词并进行分类数据分析-[安全性改造]
    以 CheatEngine 为例的六个质量属性
    2020年度春季学习总结--第一周
    软件架构师如何工作-个人见解
    Steam 游戏 《Crashlands(崩溃大陆)》修改器制作-[先使用CE写,之后有时间的话改用CheatMaker](2020年寒假小目标12)
  • 原文地址:https://www.cnblogs.com/liyangtianmen/p/3418353.html
Copyright © 2011-2022 走看看