zoukankan      html  css  js  c++  java
  • HDU

    Brute Force Sorting

    Time Limit: 1 Sec  Memory Limit: 128 MB

    题目连接

    http://acm.hdu.edu.cn/showproblem.php?pid=6215

    Description

    Beerus needs to sort an array of N integers. Algorithms are not Beerus's strength. Destruction is what he excels. He can destroy all unsorted numbers in the array simultaneously. A number A[i] of the array is sorted if it satisfies the following requirements.
    1. A[i] is the first element of the array, or it is no smaller than the left one A[i-1]. A[i1].
    2. A[i] is the last element of the array, or it is no bigger than the right one A[i+1].
    In[1,4,5,2,3], for instance, the element 5 and the element 2 would be destoryed by Beerus. The array would become [1,4,3]. If the new array were still unsorted, Beerus would do it againHelp Beerus predict the final array.

    input
    The first line of input contains an integer T(1<=T<=10) which is the total number of test cases.
    For each test case, the first line provides the size of the inital array which would be positive and no bigger than
      1000.
    The second line describes the array with N positive integers A[1],A[2],...,A[N] where each integer A[i] satisfies 1<=A[i]<=10000.
    0.

     

    Output

    For eact test case output two lines.
    The first line contains an integer M which is the size of the final array.
    The second line contains Mintegers describing the final array.
    If the final array is empty,M should be 0 and the second line should be an empty line.

     

    Sample Input

    5

    5

    1 2 3 4 5

    5

    5 4 3 2 1

    5

    1 2 3 2 1

    5

    1 3 5 4 2

    5

    2 4 1 3 5

     

    Sample Output

    5

    1 2 3 4 5

    0

    2

    1 2

    2

    1 3

    3

    2 3 5

    HINT

    题意

    有一个长度为n序列,如果第i(1<=i<=n)位上的值ai<ai-1 || ai>ai+1那么这一位需要被删除。

    删除完后,再重复以上操作,直到序列单调不降。

    题解:

    先考虑暴力,即每次扫一遍数组,删除该删的数,直到不能删为止。

    肯定有很多数扫过一遍第二次就可以不用扫了,顺着这个方向想,我们怎么节省扫描次数呢。

    我们假设第一次删除了一些数,有些连着被删除的数,我将其称为一段(一个数也算一段),那么我们只需要记住每一段被删除的数的前一个数(未删除的数)即可,(想一想为什么)

    将其存入一个队列,下次就直接扫这个队列即可。

    具体实践,我们可以用链表记录每个位置的前一个未删除的位置以及后一个未删除的位置。

    先把所有点入队,然后对于每个需要删除的点i,nex[i]肯定也要删除,则将last[i]与nex[nex[i]]相连,并将last[i]入队,当然还有一些细节需要处理,具体看代码吧。

    代码:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define N 1000050
     4 int a[N],n,last[N],nex[N],f[N];
     5 template<typename T>void read(T&x)
     6 {
     7   int k=0;char c=getchar();
     8   x=0;
     9   while(!isdigit(c)&&c!=EOF)k^=c=='-',c=getchar();
    10   if(c==EOF)exit(0);
    11   while(isdigit(c))x=x*10+c-'0',c=getchar();
    12   x=k?-x:x;
    13 }
    14 
    15 void work()
    16 {
    17   read(n);
    18   nex[0]=1;
    19   for(int i=1;i<=n;i++)
    20     read(a[i]),nex[i]=i+1,last[i]=i-1;
    21   a[n+1]=123456789;
    22   int sum=0;
    23   int k=0,flag=0;
    24   memset(f,0,sizeof(f));
    25   queue<int> Q[2];
    26   while(!Q[k].empty())Q[k].pop();
    27   while(!Q[1-k].empty())Q[1-k].pop();
    28   for(int i=1;i<=n;i++)Q[k].push(i);
    29   while(1)
    30     {
    31       flag=0;
    32       while(!Q[k].empty())
    33     {
    34       int x=Q[k].front();Q[k].pop();
    35       if (a[x]>a[nex[x]])
    36         {
    37           f[x]=1; f[nex[x]]=1;
    38           flag=1;
    39           nex[last[x]]=nex[nex[x]];
    40           last[nex[nex[x]]]=last[x];
    41           last[nex[x]]=last[x];
    42           if (f[last[x]]==0&&(Q[1-k].empty()||Q[1-k].back()!=last[x]))Q[1-k].push(last[x]);
    43         }
    44     }
    45       if (flag==0)break;
    46       k=k^1;
    47     }
    48   for(int i=1;i<=n;i++) if(f[i]==0)sum++;
    49   printf("%d
    ",sum);
    50   for(int i=1;i<=n;i++)
    51     {
    52       if(f[i]==0)
    53       printf("%d ",a[i]);
    54     }
    55   printf("
    ");
    56 }
    57 int main()
    58 {
    59 #ifndef ONLINE_JUDGE
    60   freopen("aa.in","r",stdin);
    61 #endif
    62   int q;
    63   read(q);
    64   while(q--)
    65     {
    66       work();
    67     }
    68   return 0;
    69 }
    View Code
  • 相关阅读:
    国内BI工具/报表工具厂商简介
    国内外主流BI厂商对比
    目前国内几大著名报表软件(2014更新)
    从基因组可视化工具——circos说起,circos安装
    30 个最好的数据可视化工具推荐
    用数据讲故事 七种不同的数据展示方法
    大数据时代,统计学方法有多大的效果?
    Oracle不能导入空表解决方案
    ORA-20000:ORU-10027:buffer overflow,limit of 10000 bytes错误4
    结构体内存对齐的要素--数据成员对齐的规则
  • 原文地址:https://www.cnblogs.com/mmmqqdd/p/10739456.html
Copyright © 2011-2022 走看看