牛客月赛107
E. Cidoai的可乐
(1)贪心。尽可能多的使用点权小的点,多用这些点去建边,直到度数达到限制
(2)n 个点要建成一个无环图,最少 n - 1 条边。只要建满 n - 1 条,就退出循环
(3)对所有点进行点权排序,结构体建点
(4)cmp函数返回值为 bool,若返回 true 则不改变前后顺序,返回 false 调整
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int N = 1e5 + 5, INF = 0x3f3f3f3f;
LL n, ans, a[N], d[N];
struct node
{
int a, d;
}v[N];
bool cmp(node aa, node bb)
{
return aa.a < bb.a;
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++)
cin >> v[i].a;
for (int i = 1; i <= n; i ++)
cin >> v[i].d;
sort(v + 1, v + n + 1, cmp);
int cnt = n - 1;
for (int i = 1; i <= n; i ++)
{
if (cnt < v[i].d) // 剩余需要的边数小于该点度数,则该点就是最后一个需要建边的点
{
ans += v[i].a * cnt;
break;
}
ans += v[i].a * v[i].d; // 否则这个点的度数全部用完
cnt -= v[i].d;
}
cout << ans;
return 0;
}