首页 > 其他分享 >【解题报告】RbOI Round 1,A&D题解

【解题报告】RbOI Round 1,A&D题解

时间:2024-04-07 19:15:00浏览次数:16  
标签:putchar int 题解 tot RbOI long define Round dis

【RbOI R1】A&D 题解

其他题题解请移步 BC

点击图片跳转比赛:

A.Anxious Robin

从左到右扫一遍,按照题意模拟即可。

这里解释一下我的代码:

因为只判断了六种字母,所以遇到 - 会直接过滤,无需特判。

展开代码
#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
char c[25];
int main() {
	scanf("%s", c);
	for(int i = 0; i < strlen(c); ++i) {
		if(c[i] == 'A') putchar('5');
		else if(c[i] == 'D') putchar('4');
		else if(c[i] == 'G') putchar('3');
		else if(c[i] == 'B') putchar('2');
		else if(c[i] == 'E') {
			if(c[i + 1] == '-') putchar('6');
			else putchar('1');
		}
	}
	return 0;
}

D.Sleepy Robin

给的其实是一个无向完全图,求的其实是一个最小生成树。

我们把每件事抽象成一个点,消耗的额外体力抽象成\长为 \(a_{i,j}\) 的边(断句已给出)。容易发现,题目其实是求留下 \((N-1)\) 条边,使 \(N\) 个点联通,并使所选边的边权和最小。

对此,我们有两种算法,\(Kruskal\)\(Prim\) 别惦记你内破博客了

个人感觉 \(Prim\) 比 \(Kruskal\) 好理解,看个人选择罢,反正左右都是贪心。

\(Kruskal\) ver.

展开代码
#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
const int N = 1e5 + 5; 
int n, F[N], ans, cnt; 
struct edge {
    int u, v, w;
} e[N];
bool cmp(edge a, edge b) {
    return a.w < b.w; 
} 
int find(int x) {
    if(F[x] == x) return x;
    return F[x] = find(F[x]);
}
int weal, tot;
void kruskal() {
    sort(e + 1, e + 1 + tot, cmp); 
    for(int i = 1; i <= tot; ++i) {
        int fa_u = find(e[i].u), fa_v = find(e[i].v); 
        if(fa_u == fa_v) continue;
        ans += e[i].w, F[fa_u] = fa_v; 
        if(++cnt == n - 1) return;
    }
}
int main() {
//	freopen("D10.in", "r", stdin);
//	freopen("D10.out", "w", stdout);
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) F[i] = i;
    for(int i = 1; i <= n; ++i) {
        for(int j = 1; j <= n; ++j) {
            scanf("%d", &weal);
            if(i != j) e[++tot].u = i, e[tot].v = j, e[tot].w = weal;
        }
    }
    kruskal();
    printf("%d\n", ans);
    return 0;
}

\(Prim\) ver.

展开代码
#include <bits/stdc++.h>
#define ll long long
#define MyWife Cristallo
using namespace std;
const int N = 1e5 + 5;
int n, m, s, ans, aans = 0x7fffffff;
int head[N], to[2 * N], weal[2 * N], dis[N], nxt[2 * N], tot;
bool vis[N];
void add(int u, int v, int w) {
    to[++tot] = v;
    weal[tot] = w;
    nxt[tot] = head[u];
    head[u] = tot;
}
struct node {
    int dis, pos;
};
bool operator < (const node &x, const node &y) {
    return x.dis > y.dis;
}
priority_queue<node> q;
inline void prim() {
//    for(int i = 1; i <= n; ++i) dis[i] = 0x7fffffff;
//    ans = 0x7fffffff;
//    while(!q.empty()) q.pop();
    int cnt = 0;
    dis[s] = 0;
    q.push((node){0, s});
    while(!q.empty()) {
        node tem = q.top();
        q.pop();
        int x = tem.pos, d = tem.dis;
        if(vis[x]) continue;
        vis[x] = 1, ++cnt;
        ans += d;
        for(int i = head[x]; i; i = nxt[i]) {
            int y = to[i], w = weal[i];
            if(dis[y] > w) {
                dis[y] = w;
                if(!vis[y]) q.push((node){dis[y], y});
            }
        }
    }
    if(cnt < n) ans = 0x7fffffff;
}
int main() {
//	freopen("D01.in", "r", stdin);
    scanf("%d", &n);
    int w;
    for(int i = 1; i <= n; ++i) {
        for(int j = 1; j <= n; ++j) {
            scanf("%d", &w);
            if(i != j) {add(i, j, w); add(j, i, w);}
        }
    }
    for(int i = 1; i <= n; ++i) dis[i] = 0x7fffffff;
    s = 1; 
	prim();
    printf("%d\n", ans);
    return 0;
}

彩蛋

image
image

标签:putchar,int,题解,tot,RbOI,long,define,Round,dis
From: https://www.cnblogs.com/Kiichi/p/18112780/RbOIR1

相关文章

  • 图的遍历试题解析
    一、单项选择题01.下列关于广度优先算法的说法中,正确的是(A ).Ⅰ.当各边的权值相等时,广度优先算法可以解决单源最短路径问题Ⅱ.当各边的权值不等时,广度优先算法可用来解决单源最短路径问题Ⅲ.广度优先遍历算法类似于树中的后序遍历算法Ⅳ.实现图的广度优先算法时,使用的......
  • 4.6Codeforces Global Round 25
    A题:DualTrigger题意:一个01字符串,每次只能选择俩不相邻的0,把他俩变成1(初始情况都是0)问你最后能不能把这个全0字符串,变成所要求的那样思路:首先分奇偶情况,试了几种情况发现,奇数个1是不可能的而对于偶数,也就只有一种情况是不行的:只有两个1并且最大的连续值就是2。实现:先把奇数......
  • 关于layui的单图片上传遇坑-field-input-name问题解决
    直接上代码注意field:'ymftimage'layui.use(function(){varupload=layui.upload;varlayer=layui.layer;varelement=layui.element;var$=layui.$;//单图片上传varuploadInst=upload.render({elem:'#ID-upload-demo-btn',......
  • ARC175 A~C 题解
    ARC175ASpoonTakingProblem题目大意有\(n\)个人围成一个环,第\(i\)个人左手边是第\(i\)个勺子,右手边是第\(i\%n+1\)个勺子。每个人的惯用手用一个字符\(a_i=\)L/R/?表示,即左手/右手/未知。给定\(1\simn\)的一个排列\(P_1,\dots,P_n\)表示这\(n\)个人行动的......
  • 货币系统—背包问题—python题解
    题目链接:货币系统题目描述:给定V种货币(单位:元),每种货币使用的次数不限。不同种类的货币,面值可能是相同的。现在,要你用这V种货币凑出N元钱,请问共有多少种不同的凑法。输入格式第一行包含两个整数V和N。接下来的若干行,将一共输入V个整数,每个整数表示一种货币的......
  • 5G网络建设【华为OD机试】(JAVA&Python&C++&JS题解)
    一.题目-5G网络建设现需要在某城市进行5G网络建设,已经选取N个地点设置5G基站,编号固定为1到N,接下来需要各个基站之间使用光纤进行连接以确保基站能互联互通,不同基站之间架设光纤的成本各不相同,且有些节点之间已经存在光纤相连,请你设计算法,计算出能联通这些基站的最小成本是......
  • 项目排期【华为OD机试】(JAVA&Python&C++&JS题解)
    一.题目项目组共有N个开发人员,项目经理接到了M个独立的需求,每个需求的工作量不同,且每个需求只能由一个开发人员独立完成,不能多人合作。假定各个需求直接无任何先后依赖关系,请设计算法帮助项目经理进行工作安排,使整个项目能用最少的时间交付。输入描述:第一行输入为M个需......
  • 找城市【华为OD机试】(JAVA&Python&C++&JS题解)
    一.题目-找城市一张地图上有n个城市,城市和城市之间有且只有一条道路相连:要么直接相连,要么通过其它城市中转相连(可中转一次或多次)。城市与城市之间的道路都不会成环。当切断通往某个城市i的所有道路后,地图上将分为多个连通的城市群,设该城市i的聚集度为DPi(DegreeofP......
  • 电脑病毒感染【华为OD机试】(JAVA&Python&C++&JS题解)
    一.题目-电脑病毒感染一个局域网内有很多台电脑,分别标注为0-N-1的数字。相连接的电脑距离不一样,所以感染时间不一样,感染时间用t表示。其中网络内一个电脑被病毒感染,其感染网络内所有的电脑需要最少需要多长时间。如果最后有电脑不会感染,则返回-1给定一个数组times表示......
  • 两个字符串间的最短路径问题【华为OD机试】(JAVA&Python&C++&JS题解)
    一.题目-两个字符串间的最短路径问题给定两个字符串,分别为字符串A与字符串B。例如A字符串为ABCABBA,B字符串为CBABAC可以得到下图m*n的二维数组,定义原点为(0,0),终点为(m,n),水平与垂直的每一条边距离为1,映射成坐标系如下图。从原点(0,0)到(0,A)为水平边,距离为1,从(0,A)......