CodeForces 1245D Shichikuji and Power Grid
解题思路
比赛过程中想了一个贪心——把所有城市按照自建代价排序,排在第一的城市肯定自建,之后依次判断排在后面的城市要自建还是要连接前面的。这么做WA13了(第一次忘开long longWA4)。
赛后看看题解,又参考了之前同样WA13的 Artoriax的代码,大概发现了这种做法的漏洞。假设自建代价是\(c_1<c_2<c_3\),可以构造连边的代价,使得在花费最小的连接方式中,连边应该是1—3—2,我之前那样的做法,1号城市自建以后,判断2号城市要自建还是要连1号城市,再判断3号城市要自建还是要连1号城市或者2号城市。
具体的hack数据如下——
3
1 1
2 2
2 1
1 5 100
1 2 1
说简单点大概就是,1、2、3自建代价是1、5、100,1到2连边代价是5,1到3的连边代价是2,2到3的连边代价是3。最小代价答案是6,我那种方法跑出来是8。
我后来AC的思路大概是:首先假设每个点都自建,那么每个点的代价就是自建代价。然后按照代价排序,用代价最小的点去更新后面那些点,如果能更新用电代价,就把那些点连接到当前点。然后进入下一轮循环,排除上一次代价最小的点,把剩下的点再次按照代价排序,然后用这些点中代价最小的去更新其他的,以此类推。
官方题解还提供了一种更一般的想法:这题其实就是求一个最小生成树,图是这么建的——首先所有点之间连边,边权就是连接代价,然后加一个0号点,所有点向0号点连边,边权是自建代价。这么一想,我AC的思路就是毫无堆优化的、还不如线性直接找最小值的、很蠢的Prim了。
源代码
#include<cstdio>
#include<algorithm>
int n;
struct City{
	int id;
	long long x,y;
	long long cc,kk;
	bool self;
	int fa;
	bool operator < (const City & a)const{
		return cc<a.cc;
	}
}c[2005];
int main()
{
	// freopen("test.in","r",stdin);
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		c[i].id=i;
		c[i].self=1;
		scanf("%lld%lld",&c[i].x,&c[i].y);
	}
	for(int i=1;i<=n;i++) scanf("%lld",&c[i].cc);
	for(int i=1;i<=n;i++) scanf("%lld",&c[i].kk);
	long long ans=0,selfnum=0;
	for(int i=1;i<=n;i++)
	{
		std::sort(c+i,c+1+n);//大概就是要随时排序,每次找到最小的
		ans+=c[i].cc;
		if(c[i].self) selfnum++;
		for(int j=i+1;j<=n;j++)
		{
			long long cost=(c[i].kk+c[j].kk)*(std::abs(c[i].x-c[j].x)+std::abs(c[i].y-c[j].y));
			if(cost<c[j].cc)
			{
				c[j].cc=cost;
				c[j].self=0;//放弃自建
				c[j].fa=c[i].id;
			}
		}
	}
	printf("%lld\n%lld\n",ans,selfnum);
	for(int i=1;i<=n;i++)
		if(c[i].self) printf("%d ",c[i].id);
	printf("\n%lld\n",n-selfnum);
	for(int i=1;i<=n;i++)
		if(!c[i].self) printf("%d %d\n",c[i].id,c[i].fa);
	return 0;
}
												
											CodeForces 1245D Shichikuji and Power Grid的更多相关文章
- [Codeforces 1245D] Shichikuji and Power Grid (最小生成树)
		
[Codeforces 1245D] Shichikuji and Power Grid (最小生成树) 题面 有n个城市,坐标为\((x_i,y_i)\),还有两个系数\(c_i,k_i\).在每个 ...
 - Codeforces Round #597 (Div. 2) D. Shichikuji and Power Grid 最小生成树
		
D. Shichikuji and Power Grid</centerD.> Shichikuji is the new resident deity of the South Blac ...
 - Shichikuji and Power Grid
		
D. Shichikuji and Power Grid 参考:Codeforces Round #597 (Div. 2) 思路:一个很裸的最小生成树.把建立基站看成是,城市与源点(虚构的)建边.由 ...
 - CF1245D: Shichikuji and Power Grid
		
CF1245D: Shichikuji and Power Grid 题意描述: 给定\(n\)个点\((n\leq2000)\),在第\(i\)个点上建立一个基站需要\(c_i\)的代价,连接两个点 ...
 - Codeforces Round #597 (Div. 2) D. Shichikuji and Power Grid
		
链接: https://codeforces.com/contest/1245/problem/D 题意: Shichikuji is the new resident deity of the So ...
 - Codeforces Round #597 (Div. 2) D. Shichikuji and Power Grid 题解  最小生成树
		
题目链接:https://codeforces.com/contest/1245/problem/D 题目大意: 平面上有n座城市,第i座城市的坐标是 \(x[i], y[i]\) , 你现在要给n城 ...
 - Codeforces 1245 D. Shichikuji and Power Grid
		
传送门 经典的最小生成树模型 建一个点 $0$ ,向所有其他点 $x$ 连一条边权为 $c[x]$ 的边,其他任意两点之间连边,边权为 $(k_i+k_j)(\left | x_i-x_j\right ...
 - codeforces   Codeforces Round #597 (Div. 2)    D. Shichikuji and Power Grid
		
#include<bits/stdc++.h> using namespace std ; int n; struct City { int id; long long x,y; //坐标 ...
 - [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理)
		
[Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理) 题面 一个\(n \times n\)的格子,每个格子里可以填\([1,k]\)内的整数. ...
 
随机推荐
- 小记--------CDH版本启动cloudera manager UI界面
			
首先需要启动mysql源数据库 server所在服务器的路径:/opt/cm-5.14.0/etc/cloudera-scm-server 下 查看配置文件: db.properties 查看my ...
 - 摘抄大神对VUE 中slot-scope的深度理解
			
Vue的slot-scope的场景的个人理解 这篇文章不是单纯把文档的话和api拿来翻译和演示,而是谈谈我对于slot-scope的使用场景的个人理解,如果理解错误,欢迎讨论! Vue的插槽slot, ...
 - C++运算符重载总结(真的很详细了w(゚Д゚)w)
			
C++运算符重载总结(真的很详细了w(゚Д゚)w) 概述 运算符重载可以使得一些特殊类型参与运算,我是这样理解的. 使用友元形式的运算符重载 //一般形式 class x{ friend 返回类型 o ...
 - jQuery 实现图片放大两种方式
			
jQuery 实现图片放大两种方式 一.利用css样式表实现,多用于后台显示 1.这种比较简单,利用dom元素的hover实现样式切换 <style> img{ cursor: point ...
 - 从入门到自闭之Python三大器--生成器
			
1.什么是生成器 核心:生成器的本质就是一个迭代器 迭代器是python自带的的 生成器是程序员自己写的一种迭代器 编写方式: 基于函数编写 推导式编写 def func (): print(&quo ...
 - python-socketserver实例
			
import socketserver class MyTCPHandler(socketserver.BaseRequestHandler): def handle(self): while Tru ...
 - 牛客 2C 圈圈
			
题面: shy有一个队列a[1], a[2],…,a[n].现在我们不停地把头上的元素放到尾巴上.在这过程中我们会得到n个不同的队列,每个队列都是a[k],a[k+1],…,a[n],a[1],…,a ...
 - Buy a Ticket CodeForces - 938D (dijkstra)
			
大意: n节点无向图, 点$i$到点$j$的花费为$2dis(i,j)+a[j]$, 对于每个点, 求最少花费. 每条边权翻倍, 源点S向所有点$i$连边, 权为$a[i]$, 答案就为$S$到每个点 ...
 - button标签与input type=button标签使用的差异
			
button标签和input type=button标签都是html文档中用来表示按钮属性的元素,不过他们在布局和实际使用功能中存在一些差异. 下面将项目中遇到的一些总结如下: 1.属性和布局差异. ...
 - 这十个MySQL经典错误
			
今天就给大家列举 MySQL 数据库中,最经典的十大错误案例,并附有处理问题的解决思路和方法,希望能给刚入行,或数据库爱好者一些帮助,今后再遇到任何报错,我们都可以很淡定地去处理.学习任何一门技术的同 ...