cf题面

解题思路

比赛过程中想了一个贪心——把所有城市按照自建代价排序,排在第一的城市肯定自建,之后依次判断排在后面的城市要自建还是要连接前面的。这么做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的更多相关文章

  1. [Codeforces 1245D] Shichikuji and Power Grid (最小生成树)

    [Codeforces 1245D] Shichikuji and Power Grid (最小生成树) 题面 有n个城市,坐标为\((x_i,y_i)\),还有两个系数\(c_i,k_i\).在每个 ...

  2. 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 ...

  3. Shichikuji and Power Grid

    D. Shichikuji and Power Grid 参考:Codeforces Round #597 (Div. 2) 思路:一个很裸的最小生成树.把建立基站看成是,城市与源点(虚构的)建边.由 ...

  4. CF1245D: Shichikuji and Power Grid

    CF1245D: Shichikuji and Power Grid 题意描述: 给定\(n\)个点\((n\leq2000)\),在第\(i\)个点上建立一个基站需要\(c_i\)的代价,连接两个点 ...

  5. 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 ...

  6. Codeforces Round #597 (Div. 2) D. Shichikuji and Power Grid 题解 最小生成树

    题目链接:https://codeforces.com/contest/1245/problem/D 题目大意: 平面上有n座城市,第i座城市的坐标是 \(x[i], y[i]\) , 你现在要给n城 ...

  7. Codeforces 1245 D. Shichikuji and Power Grid

    传送门 经典的最小生成树模型 建一个点 $0$ ,向所有其他点 $x$ 连一条边权为 $c[x]$ 的边,其他任意两点之间连边,边权为 $(k_i+k_j)(\left | x_i-x_j\right ...

  8. 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; //坐标 ...

  9. [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理)

    [Codeforces 1228E]Another Filling the Grid (排列组合+容斥原理) 题面 一个\(n \times n\)的格子,每个格子里可以填\([1,k]\)内的整数. ...

随机推荐

  1. HDU2087 剪花布条(字符串...半暴力写的?

    一块花布条,里面有些图案,另有一块直接可用的小饰条,里面也有一些图案.对于给定的花布条和小饰条,计算一下能从花布条中尽可能剪出几块小饰条来呢? Input输入中含有一些数据,分别是成对出现的花布条和小 ...

  2. priority_queue member function

    没有优先队列的dijkstra不算真的dijkstra 所以我又回来补常识了 <1>priority_queue::emplace <7>priority_queue::top ...

  3. [LGP4859,...] 一类奇怪的容斥套DP

    漫山遍野都是fake的光影. 题目 [LGP4859] 已经没有什么好害怕的了 给定两个长度为n的数组a和b,将a中元素与b中元素配对,求满足ai>bj的配对(i,j)个数减去满足ai<b ...

  4. SQL----Group By and Having

    合计函数 (比如 SUM) 常常需要添加 GROUP BY 语句. GROUP BY 语句 GROUP BY 语句用于结合合计函数,根据一个或多个列对结果集进行分组. SQL GROUP BY 语法 ...

  5. java实现spark常用算子之groupbykey

    import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaPairRDD;import org.apache.spa ...

  6. calc,support,media各自的含义及用法

    @support:用于检测浏览器是否支持CSS某个属性,即条件判断,如果支持某个属性,可以写一套样式,如果不支持某属性,提供另一套样式作为替补. calc():用于计算动态函数值,支持“+”,“-”, ...

  7. VUE 从零开始 学习笔记 一

    最近刚跳到一个新公司 不是很忙 决定系统的学习一下VUE这个前端框架 参考官方API 好了 废话不多说 开始了 首先 说一下吧 现在很火的主流三大前端框架 Vue,Angular.React, 为什么 ...

  8. NumPy 简介及安装

    NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库.NumPy 的前身 Numeric 最早是 ...

  9. 安卓端调用h5界面js方法和ios端调用h5界面js方法

      备注:本人为h5开发人员,不懂安卓和ios,这是开发小伙伴对接联调的主代码. 1.iOS端调用h5界面js方法:     2.安卓端调用h5界面js方法: @Override    protect ...

  10. Excel 曝Power Query安全漏洞

    近日,Mimecast 威胁中心的安全研究人员,发现了微软 Excel 电子表格应用程序的一个新漏洞,获致 1.2 亿用户易受网络攻击.其指出,该安全漏洞意味着攻击者可以利用 Excel 的 Powe ...