写了几个题
//P1111 修复公路
#include<stdio.h>
#include<stdlib.h>
int fa[1001], n, m;
int cnt;//表示集合个数
//初始化
int inti() {
for (int i = 1; i < n; i++)
fa[i] = i;
}
//求祖宗
int get_root(int i) {
if (fa[i] == i)
return i;
else {
fa[i] = get_root(fa[i]);
return fa[i];
}
}
//合并
void merge(int x, int y) {
int t1, t2;
t1 = get_root(x);
t2 = get_root(y);
if (t1 != t2) {
fa[t2] = t1;
cnt--;
}
return;
}
//定义结点
typedef struct Node {
int x;
int y;
int t;
}Node;
int cmp(const void* a, const void* b) {
Node* nodeA = (Node*)a;
Node* nodeB = (Node*)b;
return nodeA->t - nodeB->t;
//return (*(Node*)a).t - (*(Node*)b).t;
}
int main() {
Node arr[100001];
scanf("%d %d", &n, &m);
int x, y, t;
for (int i = 0; i < m; i++) {
scanf("%d %d %d", &arr[i].x, &arr[i].y, &arr[i].t);
}
qsort(arr, m, sizeof(Node), cmp);
inti();
cnt = n;
for (int i = 0; i < m; i++) {
merge(arr[i].x, arr[i].y);
if (cnt == 1) {//表示所有村庄都通了 输出最后一条
printf("%d ", arr[i].t);
return 0;
}
}
printf("-1");
return 0;
}
这题主要运用的是并查集的思想,再巩固了一下qsort去给结构体排序
//P8680[蓝桥杯 2019 省 B] 特别数的和
#include<stdio.h>
int check_nums(int n, int b[], int b_len) {
while (n) {
int digit = n % 10;
for (int i = 0; i < b_len; i++) {
if (digit == b[i]) {
return 1;
}
}
n /= 10;
}
return 0;
}
int main() {
int b[] = { 2,0,1,9 };
int b_len = sizeof(b) / sizeof(b[0]);
int n, sum = 0;
scanf("%d", &n);
for (int i = 0; i <= n; i++) {
if (check_nums(i, b, b_len)) {
sum += i;
}
}
printf("%d", sum);
return 0;
}
枚举出所有含有2,0,1,9的数全部累加起来
//P8707 [蓝桥杯 2020 省 AB1] 走方格
#include <stdio.h>
#include <string.h>
int main() {
int n, m;
scanf("%d %d", &n, &m);
int dp[35][35];
memset(dp, 0, sizeof(dp));
dp[1][1] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= m; j++) {
if (i % 2 == 0 && j % 2 == 0)
continue;
if (i != 1)
dp[i][j] += dp[i - 1][j];
if (j != 1)
dp[i][j] += dp[i][j - 1];
}
}
printf("%d\n", dp[n][m]);
return 0;
}
这里是动态规划的思想
dp[i][j]的意义是走到i,和j的位置所用的最短路径。
加上了解一些图论的基本知识
图(Graph)是由顶点的有穷非空集合V ( G ) V(G)V(G)和顶点之间边的集合E ( G ) E(G)E(G)组成,通常表示为: G = ( V , E ) G=(V,E)G=(V,E),其中,G GG表示个图,V VV是图G GG中顶点的集合,E EE是图G GG中边的集合。