D.Shichikuji and Power Grid(思维

Codeforces Round #597 (Div. 2)
题意:n个城市,每个城市要么自己建发电站(花费Ci),要么和建有发电站的城市相连(花费Ki+Kj),问所有城市通电的最小花费,并输出方案

比赛的时候根本没写到这里,昨晚真的。。。毒瘤场,队友对着A过的代码改了半小时,我快读板子出锅了Debug好久才D出来。。

题目如果只有第二种建造方法,不就是最小生成树板子吗???(设定一个建造发电厂)
再仔细一想,第一种情况的建造我们也可以把他改成两个点之间的联系:
设定一个源点0,并将源点的Ki值设定为0,那么第一种情况就是i点与0点建边了!
#include <bits/stdc++.h>
using namespace std;
#define endll '\n'
#define C getchar()
using ll = long long;
#define pi acos(-1.0)
#define INF 0x3f3f3f3f
#define mod 1000000007
#define pii pair<int, int>
const int MAXN = 1e6 + 10;
#define stop system("pause")
#define lowbit(x) ((x) & (-x))
#define Temp template <typename T>
#define mem(a, b) memset(a, b, sizeof(a))
#define rep(i, a, b) for (int i = a; i <= b; ++i)

Temp inline void rd(T &s)
{
    s = 0;T t = 1, k = C;
    for (; k < '0' || k > '9'; k = C)if (k == '-') t = -1;
    for (; k >= '0' && k <= '9'; k = C) s = (s << 1) + (s << 3) + (k ^ 48);
    s *= t;
}
const int N = 2005;
int x[N], y[N], k[N],c[N],par[N];
ll cost[N][N],dist[N];
bool done[N];
int main()
{
    int n;rd(n);
    rep(i,1,n) rd(x[i]),rd(y[i]);
    rep(i,1,n) rd(c[i]);
    rep(i,1,n) rd(k[i]);
    rep(i,1,n) rep(j,1,n)  cost[i][j] = 1LL * (k[i] + k[j]) * (abs(x[i] - x[j]) + abs(y[i] - y[j]));
    for (int i = 1; i <= n; i++)  cost[0][i] = c[i];//秒啊%%%
    for (int i = 1; i <= n; i++) dist[i] = 1e18;
    vector<int> ps;
    vector<pii > edges;
    mem(par, -1);
    ll ans = 0;
    rep(i,0,n)
    {
        ll mn = 1e18, id = -1;
        rep(i,0,n)
            if (!done[i] && dist[i] < mn)
                mn = dist[i],id = i;
        done[id] = 1;
        ans += dist[id];
        if (par[id] == 0)
            ps.push_back(id);
        else if (par[id] > 0)
            edges.push_back({par[id], id});
        rep(i,0,n)
            if (dist[i] > cost[id][i])
                dist[i] = cost[id][i],par[i] = id;
    }
    cout << ans << endl<< ps.size() << endl;
    for (int x : ps) cout << x << " ";
    cout << endl<< edges.size() << endl;
    for (auto pr : edges)  cout << pr.first << " " << pr.second << "\n";
}


全部评论

相关推荐

今天周一休息,突发奇想写一篇阶段总结。如题,我已经去了一个和Java彻底毫无关联的行业。曾经我以为自己能在计算机行业发光发热,没想到刚入行一年多就当了逃兵。从最开始的热爱到现在一看到代码就厌恶,不知道自己经历了什么。所以我去干什么了?答案是:在成都当了租房销售。上班那会压力大了就念叨着去干租房中介,但是一直下不去这个决心,想着自己学了四年多的计算机知识,终究还是不甘心。终于在某一天准备八股文的时候,看着无数篇和工作内容关系不大的理论知识,那一刻下定决心,决定尝试一下销售行业,也算是给自己一个交代。后面阴差阳错的投了成都自如去当租房管家,没想到面试很顺利,在当天一百多个面试的人里面,我成为了为数不多通过的几个幸运儿之一。目前已经培训通过,正式入职,也开了单,也有压力但是每天过得很开心,真心喜欢那种和人交流的感觉,哪怕是最后没有选择找我租房。说这些也是想告诉那些大三,大四正在找Java实习而焦虑的同学:你们现在还年轻,选择很多,容错率也很高,可以尽情去尝试自己喜欢的行业和工作。不用因为某一次的面试没通过或者简历石沉大海而焦虑,更不用因为身边人都在挤编程的独木桥就强迫自己跟风。也算是自己的碎碎念吧,也希望自己能在新的领域取得一点小成就。也祝牛油工作顺利!
沉淀小子:干啥都不丢人啊,生存是必须要的,销售很考验一个人综合素质能力的,好的销售人脉和资源可不比写字楼的白领差啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
正在热议
更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务