题目连接:

  http://codeforces.com/problemset/problem/555/B

题目大意:

  有n个岛屿(岛屿在一列上,可以看做是线性的,用来描述岛屿位置的是起点与终点),m个桥,给出每个岛屿的位置和桥的长度,问是否可以把n个岛屿连起来?

解题思路:

  排序+贪心,对于n个岛屿,相邻的两个之间起点和端点可以转化为n-1个连接桥的长度区间,把区间升序排列。

  对于m个桥升序排列,对于每一个桥枚举每个可以合法覆盖的区间,选取最优的,选取的时候满足L<bridge_length<R,L经是有序的了。我们只需选取R最小的那个,因为R越大,这个区间就能适应更多的桥。

  本宝宝对于选取最优区间的时候采用了优先队列,并不是最优的处理方式,大家有好的办法可以留言告诉弱弱。

 #include <algorithm>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <queue>
using namespace std; const int maxn = ;
#define LL __int64
struct bridge
{
LL val, id;
bool operator < (const bridge &a) const
{
return val < a.val;
}
} Bri[maxn]; struct island
{
LL r, l, id;
bool operator < (const island &a) const
{
return l < a.l;
}
} Is[maxn];
struct node
{
LL s, id;
bool operator < (const node &a) const
{
return s > a.s;
}
}; LL vis[maxn], n, m;
bool solve ()
{
priority_queue <node>Q;//当前桥可以搭建成功的区间
int l=;
memset (vis, , sizeof(vis)); for (int i=; i<m; i++)//对于每个桥选取最优的区间搭建
{
node nu;
while (!Q.empty())
{
nu = Q.top();
if (nu.s < Bri[i].val)
Q.pop();//删除队列中的不合法区间
else
break;
} while (Bri[i].val>=Is[l].l && Is[l].r >= Bri[i].val && l<n-)
{
nu.id = Is[l].id;
nu.s = Is[l].r;
Q.push (nu);//区间加进队列
l ++;
}
if (Q.empty())
continue;//没有合适的边,就继续循环加边
nu = Q.top ();
vis[nu.id] = Bri[i].id;//记录连接区间所对应的边
Q.pop();
}
for (int i=; i<n; i++)
if (!vis[i])
return false;
return true;//所有区间都对应有边
}
int main ()
{
while (scanf ("%I64d %I64d", &n, &m) != EOF)
{
island pre, cur;
LL i;
scanf ("%I64d %I64d", &pre.l, &pre.r);
for (i=; i<n; i++)
{
scanf ("%I64d %I64d", &cur.l, &cur.r);
Is[i-].id = i;
Is[i-].l = cur.l - pre.r;
Is[i-].r = cur.r - pre.l;
pre = cur;
}
for (i=; i<m; i++)
{
Bri[i].id = i+;
scanf ("%I64d", &Bri[i].val);
}
sort (Is, Is+n-);
sort (Bri, Bri+m);
if (solve ())
{
printf ("Yes\n");
for (i=; i<n-; i++)
printf ("%I64d ", vis[i]);
printf ("%I64d\n", vis[i]);
}
else
printf ("No\n");
}
return ;
}

最新文章

  1. Django模板的继承
  2. FTP协议及工作原理
  3. Windows_RTM_RC
  4. 揭秘Sql2014新特性-tempdb性能提升
  5. (转)TRANSFORM_TEX详解
  6. showmessage函数里
  7. Android开发之 Android应用程序目录结构解析
  8. Mongoose中关联查询populate的使用
  9. 部署新浪SAE web.py Session及图片上传等问题注意事项
  10. ASP根据IP来判断跳转页面
  11. SQLite学习第02天:数据类型
  12. I/O浅析
  13. FineUI开发一个b/s结构
  14. [解决]Windows Server 2012 不能安装IE版的Flash
  15. Mapper 动态代理方式
  16. Summer Holiday
  17. 假如你不小心干掉了系统,你该怎么办?(一次手贱的记录 ~ Ubuntu and Python3.6)
  18. html5-表单属性及&lt;!DOCTYPE&gt; 标签
  19. 后台返回数据判断是http还是后台本地图片 indexOf
  20. webpack 基本使用

热门文章

  1. POJ 3264 Balanced Lineup(RMQ_ST)
  2. Python遍历路径下文件并转换成UTF-8编码
  3. 支付宝移动支付之IOSApp调用支付宝钱包
  4. 【Android开发-4】进入实践,最喜欢折腾的计算器
  5. Unity5的关卡切换
  6. FFMpeg2.4.2 on Ubuntu14.04
  7. 理解Paxos Made Practical
  8. oracle 12c的数据库导进 11g
  9. Codeforces 440 D. Berland Federalization 树形DP,记录DP
  10. centos6.5 yum安装MySQL5.6