zoukankan      html  css  js  c++  java
  • 1084

    1084 - Winter
    Time Limit: 2 second(s) Memory Limit: 32 MB

    Winter is coming. In a land far away, N men are spending the nights in a valley in a largest field. The valley is so narrow that it can be considered to be a straight line running east-to-west.

    Although standing in the valley does shield them from the wind, the group still shivers during the cold nights. They, like anyone else, would like to gather together for warmth.

    Near the end of each day, each man i finds himself somewhere in the valley at a unique location Li. The men want to gather into groups of three or more persons since two persons just aren't warm enough. They want to be in groups before sunset, so the distance K each man can walk to form a group is limited. Determine the smallest number of groups the men can form.

    Input

    Input starts with an integer T (≤ 15), denoting the number of test cases.

    Each case starts with two integers N (1 ≤ N ≤ 105) and K (1 ≤ K ≤ 106). Each of the next N line contains an integer Li (1 ≤ Li ≤ 108).

    Output

    For each case, print the case number and smallest number of groups the men can gather into. If there is no way for all the men to gather into groups of at least size three, output -1.

    Sample Input

    Output for Sample Input

    2

    6 10

    2

    10

    15

    13

    28

    9

    3 1

    1 10 20

    Case 1: 2

    Case 2: -1

    Note

    Dataset is huge, use faster I/O methods.


    Special Thanks: Jane Alam Jan (Description, Solution, Dataset)
    思路:dp
    首先我们可以想到N*N的方法,dp[i]=min(dp[i],dp[j]+1),(j<=i-2;)并且这个j还需满足ans[i]-ans[j+1]<=k;
    dp[i]表示前i个点合法分配的最小值,我们将所有的dp先赋值无穷大,那么先将所有的数先按照升序排。我们可以知道当前面的一些状态不能够达到最优时也必然不能使后面的点达最优,所以前面的点可以不考虑,所以我们维护一个队列,如果一些点可以确定不能使后面的达最优,就出队。
     1 #include<stdio.h>
     2 #include<algorithm>
     3 #include<iostream>
     4 #include<stdlib.h>
     5 #include<string.h>
     6 #include<queue>
     7 using namespace std;
     8 typedef long long LL;
     9 int dp[100005];
    10 typedef struct pp
    11 {
    12         int x;
    13         int id;
    14 } ss;
    15 int ans[100005];
    16 ss ask[100005];
    17 int flag[100005];
    18 int main(void)
    19 {
    20         int i,j,k;
    21         scanf("%d",&k);
    22         int s;
    23         for(s=1; s<=k; s++)
    24         {
    25                 queue<ss>que;
    26                 memset(flag,0,sizeof(flag));
    27                 int n,m;
    28                 scanf("%d %d",&n,&m);
    29                 for(i=1; i<=n; i++)
    30                 {
    31                         scanf("%d",&ans[i]);
    32                 }
    33                 sort(ans+1,ans+n+1);
    34                 for(i=1; i<=n; i++)
    35                 {
    36                         ask[i].id=i;
    37                         ask[i].x=ans[i];
    38                 }
    39                 int as=0;
    40                 dp[0]=0;
    41                 if(n<=2)
    42                         as=-1;
    43                 else
    44                 {
    45                         que.push(ask[1]);
    46                         que.push(ask[2]);
    47                         flag[1]=1;
    48                         flag[2]=1;
    49                         for(i=1; i<=n; i++)
    50                                 dp[i]=1e9;
    51                         int f=0;
    52                         for(i=3; i<=n; i++)
    53                         {
    54                                 while(!que.empty())
    55                                 {
    56                                         f=1;
    57                                         ss cc=que.front();
    58                                         int vv=(cc.x+ask[i].x+1)/2;
    59                                         int uu=vv-cc.x;
    60 
    61                                         if(uu>m)
    62                                         {
    63                                                 que.pop();
    64                                         }
    65                                         else
    66                                         {
    67                                                 if(i-cc.id>=2)
    68                                                 {
    69                                                         dp[i]=min(dp[i],dp[cc.id-1]+1);
    70                                                         if(dp[i]<1e9)
    71                                                                 break;
    72                                                         else que.pop();
    73                                                 }
    74                                                 else break;
    75                                         }
    76 
    77                                 }
    78                                 que.push(ask[i]);
    79                                 if(!f)
    80                                         break;
    81                         }
    82                         if(dp[n]==1e9)
    83                         {
    84                                 as=-1;
    85                         }
    86                         else as=dp[n];
    87                 }
    88                 printf("Case %d: %d
    ",s,as);
    89         }
    90         return 0;
    91 }
    油!油!you@
  • 相关阅读:
    项目分析-纷享车链AutoChain的数据保险柜解读
    AutoChain纷享车链背后的技术支撑——Higgs Chain 的生态体系解读
    纷享车链AutoChain首创之数据保险柜的解读
    实业落地的区块链车联网-纷享车链AutoChain项目非官方解读
    第三方测评:IOV智能车链&CarBlock&阿尔法车链&第一车链&纷享车链
    区块链如何赋能车联网-Higgs Chain
    BTC挖矿成本¥36599.29,市价¥41,598.25——五大币种挖矿成本分析 2018-07-13
    驾图&IOVC背后的公链技术-Higgs Chain全方位解读(一)
    进军区块链前必读!!BTC挖矿成本¥36554.13,市价¥43697.44——五大币种挖矿成本分析 2018-07-10
    驾图挖矿IOVC的背后HiggsChain第一期周报解读,有实际落地应用的公链足以对标ETH?
  • 原文地址:https://www.cnblogs.com/zzuli2sjy/p/5509957.html
Copyright © 2011-2022 走看看