zoukankan      html  css  js  c++  java
  • Codeforces Round #611 (Div. 3)

    D-Christmas Trees

    题目的大致意思是,在无限长的坐标轴上,有一些圣诞树,坐标由X数组给出,然后有一些人想尽可能的离树近一点,所以题目要求求出一个数组y,表示对应人坐在坐标轴的位置,并且满足所有人距离他最近的圣诞树的距离和最小,题目会给出圣诞树和人的数目,也就是两个数组的长度。

    思路

    就想到了暴力的思路,枚举与圣诞树距离为1、2、3、.......的点,很不幸的时间超限了,因为这样会导致很多已经不能在作为圣诞树的点位置重复遍历,时间复杂度 (O(n*dis))

    
    inline int read()
    {
        char c=getchar();int x=0,f=1;
        while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
        return x*f;
    }
    unordered_map<int,bool>mp;
    int a[200005];
    main(void)
    {
    	int n,m;
    	n=read();
    	m=read();
    	for(int i=1;i<=n;i++)
    	a[i]=read();
    	sort(a+1,a+1+n);
    	a[0]=-1000000005;
    	a[n+1]=1000000005;
    	vector<int >b;
    	int ans=0;
    	for(int i=1;i<=200005;i++)
    	{	
    		for(int j=1;j<=n;j++)
    		{
    			if(!mp[a[j]-i]&&a[j]-i>a[j-1])
    			{
    				mp[a[j]-i]=true;
    				b.push_back(a[j]-i);
    				ans+=i;
    				m--;
    			}
    			if(!m)break;
    			if(!mp[a[j]+i]&&a[j]+i<a[j+1])
    			{
    				mp[a[j]+i]=true;
    				b.push_back(a[j]+i);
    				ans+=i;
    				m--;
    			}
    			if(!m)break;
    		}
    		if(!m)break;
    	}
    	int len=b.size();
    	printf("%d
    ",ans);
    	for(int i=0;i<len;i++)
    	{
    		printf("%d ",b[i]);
    	}
    }
    

    bfs

     #include<iostream>
    #include<vector>
    #include<algorithm>
    #include<cmath>
    #include<cstring>
    #include<queue>
    #include<map>
    using namespace std;
    const int mod = 1e9+7;
    const int maxn = 2e5+5;
    typedef long long ll;
    queue<pair<int,int> > q;
    map<int,bool> vis;//用map记录是否访问过
    vector<int> v;
    int main(){
    	int n,m;cin>>n>>m;
    	while(n--){
    	int t;cin>>t;
    	vis[t] = 1;
    	q.push({1,t+1}),q.push({1,t-1});  //首先存距离为1的点
    	}
    	ll ans = 0;
    	while( m>0 && !q.empty() ){
    		pair<int,int> cur = q.front() ;
    		q.pop() ;
    		if(vis[cur.second]!=1){//如果没有遍历过
    		m--;
    		v.push_back(cur.second ); 
    		ans+=cur.first;
    		vis[cur.second] = 1;
    		if(vis[cur.second+1] != 1) q.push({cur.first+1,cur.second+1});//距离+1,入队列
    		if(vis[cur.second-1] != 1)q.push({cur.first+1,cur.second-1});   //同上
    		}
    	}
    	cout<<ans<<endl;
    	for(int i = 0;i<v.size() ;i++){
    	cout<<v[i]<<" ";
    	}
    	return 0;
    }
    
  • 相关阅读:
    记录第一次阿里云服务器部署java web工程的经历
    常用网站……
    根据ID获取CEdit的句柄实例
    (转)MFC中获得各个类的指针/句柄 ID的总结
    (转)DoDataExchange执行时机
    深入浅出Visual_C动态链接库(Dll)编程(宋宝华)----整理(word)
    (转)MFC的一些宏的整理 (DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE)
    Socket 学习入门
    (转) 新的开始之Win7、CentOS 6.4 双系统 硬盘安装
    WIN7下使用VC2010调试uCOS-II 2.91
  • 原文地址:https://www.cnblogs.com/wangqianyv/p/13275551.html
Copyright © 2011-2022 走看看