第十五次CCF-CSP认证
- 小明上学
- 满分思路
- 数据中心
- 满分思路
- 小明放学
- 满分题解
小明上学
题目链接
满分思路
其实题目看着长,但是做起来是非常好写的,其实主要原因在于,他的红绿灯的变化规律是一定的,而且小明路上的每次红绿灯情况都给你了,所以…《凌驾》
#include <iostream>
using namespace std;
int main()
{
int r, y , g;//记录三种灯的时间
cin >> r >> y >>g;
int res = 0;//总耗时
int T;
cin >> T;
while(T--)
{
int flag, time;//各个情况
cin >> flag >> time;
switch (flag)
{
case 0 ://直接通过
res += time;
continue;
case 1://等待剩余时间后通过
res += time;
continue;
case 2://:等待剩余时间后,再等个红灯通过
res =res + time + r;
continue;
}
}
cout << res;
return 0;
}
数据中心
题目链接
样例:
满分思路
并查集的讲解
#include<iostream>
#include <algorithm>
using namespace std;
const int N = 5e4+10,M=1e5+10;
int n,m,root,v,u,t,res; // n是点数,m是边数
int p[N]; // 并查集的父节点数组
struct Edge // 存储边
{
int a, b, w;
bool operator< (const Edge &W)const
{
return w < W.w;
}
}edges[M];
int find(int x) // 并查集核心操作
{
if (p[x] != x) p[x] = find(p[x]);
return p[x];
}
int kruskal()
{
sort(edges, edges + m);
for (int i = 1; i <= n; i ++ ) p[i] = i; // 初始化并查集
int res = 0;
for (int i = 0; i < m; i ++ )
{
int a = edges[i].a, b = edges[i].b, w = edges[i].w;
a = find(a), b = find(b);
if (a != b) // 如果两个连通块不连通,则将这两个连通块合并
{
p[a] = b;
res = w;
}
}
return res;
}
signed main(){
cin>>n>>m>>root;
for(int i=0;i<m;i++){
cin>>v>>u>>t;
edges[i]={v,u,t};
}
cout<<kruskal();
return 0;
}
小明放学
os:什么小明,李华给 lz gun 远一点
题目链接
样例: