zoukankan      html  css  js  c++  java
  • Winter(bfs&&dfs)

    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
    ",++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
    ",++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
    ",++kase,ans);
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    linuxc查看进程命令
    Springboot+post请求接口
    Springboot+get请求接口
    xml 加载多个properties文件
    TCP的三次握手(建立连接)和四次挥手(关闭连接)
    记一次 synchronized 锁字符串引发的坑兼再谈 Java 字符串
    java单点登录原理与简单实现
    关于 Java 面试,你应该准备这些知识点
    Java 内存模型
    java利用SuffixFileFilter统计目录下特定后缀名文件的数目
  • 原文地址:https://www.cnblogs.com/handsomecui/p/5040914.html
Copyright © 2011-2022 走看看