BZOJ3426: Poi2013 Tower Defense Game
2016-05-29 13:13
337 查看
题目大意:有一个n个点m条边的图,每条边距离是1,已知用k个攻击距离为1的塔可以打到整个地图,让构造一个方案使得用小于等于k个攻击距离为2的塔打到整个地图
说是有spj,但是实际上没有,不过没有关系,因为这题每次挑一个没被覆盖的放就可以了,总个数一定小于等于k
怎么证明呢?
假设当前选择了一个还没被覆盖的点,那就在这里放一个攻击距离为2的塔
而在原方案中能覆盖这个点的所有塔的攻击范围的并集一定小于等于这个攻击距离为2的塔的攻击范围(这个很好证)
所以这样一定能在k个塔以内覆盖全部
没有spj,那就只能贪心的先放小的了
说是有spj,但是实际上没有,不过没有关系,因为这题每次挑一个没被覆盖的放就可以了,总个数一定小于等于k
怎么证明呢?
假设当前选择了一个还没被覆盖的点,那就在这里放一个攻击距离为2的塔
而在原方案中能覆盖这个点的所有塔的攻击范围的并集一定小于等于这个攻击距离为2的塔的攻击范围(这个很好证)
所以这样一定能在k个塔以内覆盖全部
没有spj,那就只能贪心的先放小的了
#include<iostream> #include<cstdio> #include<cstdlib> #define N 1000010 using namespace std; int to[N<<1],nxt[N<<1],pre ,cnt; void ae(int ff,int tt) { cnt++; to[cnt]=tt; nxt[cnt]=pre[ff]; pre[ff]=cnt; } bool used ,used2 ; void upd2(int x) { used[x]=true; int i,j; for(i=pre[x];i;i=nxt[i]) { j=to[i]; used[j]=true; } } void upd(int x) { used[x]=true; used2[x]=true; int i,j; for(i=pre[x];i;i=nxt[i]) { j=to[i]; if(used2[j]) continue; used2[j]=true; upd2(j); } } int chs ; int main() { int n,m,k; scanf("%d%d%d",&n,&m,&k); int i,j,x,y; for(i=1;i<=m;i++) { scanf("%d%d",&x,&y); ae(x,y);ae(y,x); } int tot=0; for(i=1;i<=n;i++) if(!used[i]) { tot++; chs[tot]=i; upd(i); } printf("%d\n",tot); for(i=1;i<tot;i++) printf("%d ",chs[i]); printf("%d",chs[tot]); }
相关文章推荐
- 消除viewport的疑惑-移动网页开发
- Different Ways to Add Parentheses
- Html学习(1)- 概述
- html5+Canvas实现酷炫的小游戏
- 浅谈JQuery
- 18位身份证号码规则及js验证
- JavaScript中的Function类型总结
- 《Nodejs开发加密货币》之十六:利益,魔鬼与天使的共同目标
- SecureCRT如何修改字体样式和大小
- 前端精选文摘:BFC 神奇背后的原理
- Eclipse如果关闭了JavaScript、xml等文件的校验,我怎么人工去验证某个诸如xml文件格式是否有错误??
- css hack
- jquery强化教程2016第1节-编写第一个JQuery程序
- JavaScript的常用内置类
- JS报错:Uncaught SyntaxError: Unexpected identifier
- 利用 filter 机制给静态资源 url 加上时间戳,来防止js和css文件的缓存问题
- React Native资料集
- 动感的CSS3 Loading加载文字动画特效
- javascript实现粘贴qq截图功能(clipboardData)
- 利用 filter 机制 给 静态资源 url 加上时间戳,来防止js和css文件的缓存,利于开发调试