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.

题意:N个人要在日落前都组成>=3的组,最多走距离k;问组成最少的组数;不能输出-1;

思路:本来自己想着贪心的,最后发现自己想错了,因为聚集点是不确定的,而且要的是最小的组,看了巨巨的有dfs还有bfs的;于是就借鉴了巨巨的思路;感觉应该是优先队列的,巨巨竟然不是优先队列也对了,膜拜;

bfs:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int INF=0x3f3f3f3f;
#define SI(x) scanf("%d",&x)
#define PI(x) printf("%d",x)
#define P_ printf(" ")
#define T_T while(T--)
#define mem(x,y) memset(x,y,sizeof(x))
const int MAXN=1e5+100;
int a[MAXN];
int N,K;
int vis[MAXN];
/*struct Node{
int l,r;
friend bool operator < (Node a,Node b){
if(a.l!=b.l)return a.l<b.l;
else return a.r<b.r;
}
};
Node d[MAXN];*/
struct Node{
int pos,gg;
friend bool operator < (Node a,Node b){
return a.gg>b.gg;
}
};
priority_queue<Node>dl;
int bfs(){
Node p,q;
mem(vis,0);
vis[0]=1;
while(!dl.empty())dl.pop();
p.pos=0;p.gg=0;
dl.push(p);
while(!dl.empty()){
p=dl.top();dl.pop();
int temp=p.pos;
if(temp>=N)return p.gg;
while(temp<N&&a[temp]-a[p.pos]<=2*K)temp++;
//PI(temp);puts("");
if(temp-p.pos>=3){
q.pos=temp;q.gg=p.gg+1;
if(!vis[q.pos])
dl.push(q);
vis[q.pos]=1;
}
if(temp-p.pos>=4){
q.pos=temp-1;q.gg=p.gg+1;
if(!vis[q.pos])
dl.push(q);
vis[q.pos]=1;
}
if(temp-p.pos>=5){
q.pos=temp-2;q.gg=p.gg+1;
if(!vis[q.pos])
dl.push(q);
vis[q.pos]=1;
}
}
return -1;
}
int main(){
int T,kase=0;
SI(T);
T_T{
SI(N);SI(K);
for(int i=0;i<N;i++)SI(a[i]);
sort(a,a+N);
//for(int i=0;i<N;i++)PI(a[i]),P_;puts("");
/*int l,r;
for(int i=0;i<N;i++){
d[i].l=lower_bound(a,a+N,a[i]-K)-a;
d[i].r=upper_bound(a,a+N,a[i]+K)-a-1;
}
sort(d,d+N);*/
printf("Case %d: %d\n",++kase,bfs());
}
return 0;
}

  dfs:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
const int INF=0x3f3f3f3f;
#define SI(x) scanf("%d",&x)
#define PI(x) printf("%d",x)
#define P_ printf(" ")
#define T_T while(T--)
#define mem(x,y) memset(x,y,sizeof(x))
const int MAXN=1e5+100;
int a[MAXN];
int N,K;
int vis[MAXN];
/*struct Node{
int pos,gg;
friend bool operator < (Node a,Node b){
return a.gg>b.gg;
}
};
priority_queue<Node>dl;
int bfs(){
Node p,q;
mem(vis,0);
vis[0]=1;
while(!dl.empty())dl.pop();
p.pos=0;p.gg=0;
dl.push(p);
while(!dl.empty()){
p=dl.top();dl.pop();
int temp=p.pos;
if(temp>=N)return p.gg;
while(temp<N&&a[temp]-a[p.pos]<=2*K)temp++;
//PI(temp);puts("");
if(temp-p.pos>=3){
q.pos=temp;q.gg=p.gg+1;
if(!vis[q.pos])
dl.push(q);
vis[q.pos]=1;
}
if(temp-p.pos>=4){
q.pos=temp-1;q.gg=p.gg+1;
if(!vis[q.pos])
dl.push(q);
vis[q.pos]=1;
}
if(temp-p.pos>=5){
q.pos=temp-2;q.gg=p.gg+1;
if(!vis[q.pos])
dl.push(q);
vis[q.pos]=1;
}
}
return -1;
}
int main(){
int T,kase=0;
SI(T);
T_T{
SI(N);SI(K);
for(int i=0;i<N;i++)SI(a[i]);
sort(a,a+N);
//for(int i=0;i<N;i++)PI(a[i]),P_;puts("");
printf("Case %d: %d\n",++kase,bfs());
}
return 0;
}*/
int ans,flot;
void dfs(int pos,int gg){
int temp=pos;
if(flot)return;
if(pos>=N){
flot=1;
ans=gg;
return;
}
while(temp<N&&a[temp]-a[pos]<=2*K)temp++;
if(!vis[temp])if(temp-pos>=3)vis[temp]=1,dfs(temp,gg+1);
if(!vis[temp-1])if(temp-pos>=4)vis[temp-1]=1,dfs(temp-1,gg+1);
if(!vis[temp-2])if(temp-pos>=5)vis[temp-2]=1,dfs(temp-2,gg+1);
}
int main(){
int T,kase=0;
SI(T);
T_T{
SI(N);SI(K);
for(int i=0;i<N;i++)SI(a[i]);
sort(a,a+N);
//for(int i=0;i<N;i++)PI(a[i]),P_;puts("");
flot=0;
mem(vis,0);
vis[0]=1;
dfs(0,0);
if(!flot)ans=-1;
printf("Case %d: %d\n",++kase,ans);
}
return 0;
}

  

Winter(bfs&&dfs)的更多相关文章

  1. POJ 2227 The Wedding Juicer (优先级队列+bfs+dfs)

    思路描述来自:http://hi.baidu.com/perfectcai_/item/701f2efa460cedcb0dd1c820也可以参考黑书P89的积水. 题意:Farmer John有一个 ...

  2. 邻结矩阵的建立和 BFS,DFS;;

    邻结矩阵比较简单,, 它的BFS,DFS, 两种遍历也比较简单,一个用队列, 一个用数组即可!!!但是邻接矩阵极其浪费空间,尤其是当它是一个稀疏矩阵的时候!!!-------------------- ...

  3. Collect More Jewels(hdu1044)(BFS+DFS)

    Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

  4. Cleaning Robot (bfs+dfs)

    Cleaning Robot (bfs+dfs) Here, we want to solve path planning for a mobile robot cleaning a rectangu ...

  5. LeetCode:BFS/DFS

    BFS/DFS 在树专题和回溯算法中其实已经涉及到了BFS和DFS算法,这里单独提出再进一步学习一下 BFS 广度优先遍历 Breadth-First-Search 这部分的内容也主要是学习了labu ...

  6. 图的基本遍历算法的实现(BFS & DFS)复习

    #include <stdio.h> #define INF 32767 typedef struct MGraph{ ]; ][]; int ver_num, edge_num; }MG ...

  7. BFS/DFS算法介绍与实现(转)

    广度优先搜索(Breadth-First-Search)和深度优先搜索(Deep-First-Search)是搜索策略中最经常用到的两种方法,特别常用于图的搜索.其中有很多的算法都用到了这两种思想,比 ...

  8. NOIP2010引水入城[BFS DFS 贪心]

    题目描述 在一个遥远的国度,一侧是风景秀美的湖泊,另一侧则是漫无边际的沙漠.该国的行政区划十分特殊,刚好构成一个N 行M 列的矩形,如上图所示,其中每个格子都代表一座城市,每座城市都有一个海拔高度. ...

  9. HDU 1044 Collect More Jewels(BFS+DFS)

    Collect More Jewels Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Othe ...

随机推荐

  1. B实习面试

    1. 多态和继承关系,继承的几种实现机制? 实现多态,有二种方式,覆盖,重载. 覆盖,是指子类重新定义父类的虚函数的做法. 重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或 ...

  2. 使用反射类、Class类获取指定的构造器并实例化对象

    package com.test; public class Car { private String brand; private String color; private int maxSpee ...

  3. fafu 1100 线段树

    题目链接 单点更新, 区间查询. 这题空间好小.... #include <iostream> #include <vector> #include <cstdio> ...

  4. 重拾javascript动态客户端网页脚本

    笔记一: 一.DOM 作用: ·              DOM(Doument Object Model) 1.document文档 HTML 文件 (标记语言) <html> < ...

  5. appledoc:Objective-C注释文档生成工具

    appledoc是帮助Objective-C开发者从特殊格式的源代码注释中生成类似apple资源代码帮助文档的命令行工具. 安装和使用都非常简单: 安装 git clone git://github. ...

  6. 【课程分享】ASP.NET MVC5&amp;微信公众平台整合开发实战(响应式布局、JQuery Mobile,Windows Azure、微信核心开发)

    对这个课程有兴趣的,能够联系我QQ2748165793 基础知识储备 ASP.NET MVC 5基础(6讲) 第一讲-初识ASP.NET MVC并搭建整合开发环境 第二讲-深入MVC开发模式 第三讲- ...

  7. 新浪微博开放平台开发-android客户端(1)【转】

    http://www.cnblogs.com/virusswb/archive/2011/08/05/2128941.html 最近不是太忙,花了一些时间学习android的应用开发.经过两个星期的学 ...

  8. linux多线程示例

    #include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <pthread.h& ...

  9. 第一章 什么是SQL Server Integration Services (ssis) 系统。

    note:我也是刚入门的菜鸟,让我们大家一块学习SSIS系统,工作中需要用到SSIS.您的浏览是我更新的最大动力,谢谢!  SSIS是Microsoft SQL Server Integration ...

  10. [原创] ASP.NET WEBAPI 接入微信公众平台 总结,Token验证失败解决办法

    首先,请允许我说一句:shit! 因为这个问题不难,但是网上有关 ASP.NET WEBAPI的资料太少.都是PHP等等的. 我也是在看了某位大神的博客后有启发,一点点研究出来的. 来看正题! 1.微 ...