#include<stdio.h>
int main()
{ int n, m;scanf("%d %d", &n, &m);int a[15005], b[15005];for (int i = 0; i < n; i++)scanf("%d", &a[i]);int ans = a[n - 1] - a[0] + 1;for (int i = 0; i < n - 1; i++)b[i] = a[i + 1] - a[i];for(int i=0;i<n-2;i++)for(int j=0;j<n-2-i;j++)if (b[j + 1] > b[j]){int temp = b[j + 1];b[j + 1] = b[j];b[j] = temp;}for (int i = 0; i < m - 1; i++)ans =ans - (b[i] - 1);printf("%d", ans);return 0;
}
#include<stdio.h>int main()
{int n, m;scanf("%d %d", &n, &m);int a[n + 5];for (int i = 1; i <= n; i++){scanf("%d", &a[i]);}int x[m + 5], y[m + 5], res = -1;for (int i = 0; i < m; i++){scanf("%d %d", &x[i], &y[i]);if (res < x[i]){res = x[i];}}int ans = 1e9;for (int i = res; i <= n; i++){if (ans > a[i])ans = a[i];}printf("%d", ans);return 0;
}
c
#include <stdio.h>
#include <stdlib.h>#define MAXN 5005
#define MAXM 200005// 定义边的结构体
typedef struct {int start; // 边的起点int end; // 边的终点int value; // 边的权值
} Edge;Edge edges[MAXM]; // 存储所有的边
int parent[MAXN]; // 并查集的父节点数组
int n, m; // n 为顶点数,m 为边数
int edgeCount = 0; // 记录已经加入最小生成树的边的数量
int totalWeight = 0; // 最小生成树的总权值// 比较函数,用于 qsort 对边按权值排序
int compare(const void *a, const void *b) {Edge *edgeA = (Edge *)a;Edge *edgeB = (Edge *)b;return edgeA->value - edgeB->value;
}// 查找元素 x 所属集合的根节点,并进行路径压缩
int find(int x) {if (parent[x] != x) {parent[x] = find(parent[x]);}return parent[x];
}// 合并两个集合
void unionSets(int x, int y) {int rootX = find(x);int rootY = find(y);if (rootX != rootY) {parent[rootX] = rootY;}
}// Kruskal 算法核心函数
void kruskal() {// 对边按权值从小到大排序qsort(edges, m, sizeof(Edge), compare);for (int i = 0; i < m; i++) {int start = edges[i].start;int end = edges[i].end;int value = edges[i].value;int rootStart = find(start);int rootEnd = find(end);// 如果加入这条边不会形成环if (rootStart != rootEnd) {unionSets(start, end);edgeCount++;totalWeight += value;// 当加入的边数达到 n - 1 条时,最小生成树构建完成if (edgeCount == n - 1) {break;}}}
}int main() {// 读取顶点数和边数scanf("%d %d", &n, &m);// 初始化并查集,每个顶点的父节点是自身for (int i = 1; i <= n; i++) {parent[i] = i;}// 读取每条边的信息for (int i = 0; i < m; i++) {scanf("%d %d %d", &edges[i].start, &edges[i].end, &edges[i].value);}// 执行 Kruskal 算法kruskal();// 判断图是否连通if (edgeCount == n - 1) {printf("%d\n", totalWeight);} else {printf("orz\n");}return 0;
}
c++
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n, m, i, j, u, v, total;
struct node {int start, to;long long edge;
}bian[10000000];
int f[1000000];
long long ans;
bool cmp(node a, node b) {return a.edge < b.edge;
}
int find(int x) {if (f[x] == x)return x;else return f[x] = find(f[x]);
}
void tree() {for (int i = 1; i <= m; i++) {int u = find(bian[i].start);int v = find(bian[i].to);if (u == v)continue;ans += bian[i].edge;f[u] = v;total++;if (total == n - 1)break;}
}int main()
{cin >> n >> m;for (int i = 1; i <= n; i++)f[i] = i;for (int i = 1; i <= m; i++) {cin >> bian[i].start >> bian[i].to >> bian[i].edge;}sort(bian + 1, bian + m + 1, cmp);tree();if (total == n - 1)cout << ans;else cout << "orz";return 0;
}
#include <stdio.h>
#include <stdlib.h>#define MAXN 1005// 定义方向数组,用于表示上下左右四个方向
int dx[4] = { -1, 1, 0, 0 };
int dy[4] = { 0, 0, -1, 1 };// 定义队列结构
typedef struct {int x;int y;
} Point;typedef struct {Point items[MAXN * MAXN];int front;int rear;
} Queue;// 初始化队列
void initQueue(Queue* q) {q->front = 0;q->rear = 0;
}// 判断队列是否为空
int isEmpty(Queue* q) {return q->front == q->rear;
}// 入队操作
void enqueue(Queue* q, Point p) {q->items[q->rear++] = p;
}// 出队操作
Point dequeue(Queue* q) {return q->items[q->front++];
}// 检查坐标 (x, y) 是否在迷宫范围内且与当前格子值不同
int isValid(int x, int y, int n, char maze[MAXN][MAXN], char target)
{return x >= 0 && x < n && y >= 0 && y < n && maze[x][y] != target;
}// BFS 函数,从 (x, y) 开始进行广度优先搜索
int bfs(int x, int y, int n, char maze[MAXN][MAXN], int visited[MAXN][MAXN], int areaId) {Queue q;initQueue(&q);Point start = { x, y };enqueue(&q, start);visited[x][y] = areaId;int size = 0;while (!isEmpty(&q)) {Point cur = dequeue(&q);size++;char target = maze[cur.x][cur.y];for (int i = 0; i < 4; i++) {int newX = cur.x + dx[i];int newY = cur.y + dy[i];if (isValid(newX, newY, n, maze, target) && visited[newX][newY] == 0) {Point next = { newX, newY };enqueue(&q, next);visited[newX][newY] = areaId;}}}return size;
}int main() {int n, m;char maze[MAXN][MAXN];int visited[MAXN][MAXN] = { 0 };int areaSize[MAXN * MAXN] = { 0 };scanf("%d %d", &n, &m);for (int i = 0; i < n; i++) {scanf("%s", maze[i]);}int areaId = 1;for (int i = 0; i < m; i++) {int x, y;scanf("%d %d", &x, &y);x--; // 转换为 0 索引y--;if (visited[x][y] == 0) {areaSize[areaId] = bfs(x, y, n, maze, visited, areaId);areaId++;}printf("%d\n", areaSize[visited[x][y]]);}return 0;
}
#include <stdio.h>#define INF 1e9int n, f[205], m[205][205];int min(int a, int b) {return a < b ? a : b;
}int main()
{// 读取出租站的数量scanf("%d", &n);// 读取租金矩阵for (int i = 1; i < n; i++) {for (int j = i + 1; j <= n; j++) {scanf("%d", &m[i][j]);}}// 初始化 f 数组for (int i = 1; i <= n; i++) {f[i] = INF;}f[1] = 0; // 从出租站 1 到出租站 1 的租金为 0// 动态规划计算最少租金for (int i = 1; i < n; i++) {for (int j = i + 1; j <= n; j++) {f[j] = min(f[j], f[i] + m[i][j]);}}// 输出从出租站 1 到出租站 n 的最少租金printf("%d", f[n]);return 0;
}