程序一代码:
#include <bits/stdc++.h>
using namespace std;
int x, y;
unsigned int n;
int main() {
cin >> n >> x >> y;
unsigned int mask = 0xff;
int x8 = x << 3;
int y8 = y << 3;
unsigned int nx = (n >> x8) & mask, ny = (n >> y8) & mask;
n &= (~(mask << x8));
n &= (~(mask << y8));
n |= (nx << y8);
n |= (ny << x8);
cout << "0x";
cout << std::hex << n << endl;
return 0;
}
程序二代码:
#include <bits/stdc++.h>
using namespace std;
int n, k;
int func(vector <int> &nums) {
int ret = 0;
for(int i = n; i > k; i--) {
if(nums[i] > nums[i - k]) {
swap(nums[i], nums[i - k]);
ret++;
}
}
return ret;
}
int main() {
cin >> n >> k;
vector <int> a(n + 1, 0);
for(int i = 1; i <= n; i++)
cin >> a[i];
int counter = 0, previous = -1;
while(counter != previous){
previous = counter;
counter += func(a);
}
for(int i = 1; i <= n; i++)
cout << a[i] << ",";
cout << endl << counter << endl;
return 0;
}
程序三代码:
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
const int MAXN = 200001;
int main() {
int n, m, l, r, w;
cin >> n >> m;
vector <int> dist(MAXN, -1);
vector <bool> vis(MAXN, false);
vector <vector <pair<int, int> > > go(MAXN);
for(int i = 1; i <= m; i++) {
cin >> l >> r >> w;
go[l].push_back(make_pair(r + 1, w));
go[r + 1].push_back(make_pair(l, -w));
}
queue <int> q;
dist[1] = 0, vis[1] = true;
q.push(1);
while(!q.empty()) {
int x = q.front(); q.pop();
for(auto i : go[x]) {
if(!vis[i.first]) {
vis[i.first] = true;
dist[i.first] = dist[x] + i.second;
q.push(i.first);
}
}
}
if(dist[n + 1] == -1) cout << "sorry" << endl;
else cout << dist[n + 1] << endl;
return 0;
}
程序三代码详细解释:
#include <iostream>
#include <vector>
#include <queue>
using namespace std;
// 定义一个常量MAXN,作为节点数的上限
const int MAXN = 200001;
int main() {
int n, m, l, r, w;
// 读取节点数n和边数m
cin >> n >> m;
// 初始化距离数组dist,所有节点的初始距离为-1(表示未访问)
vector <int> dist(MAXN, -1);
// 初始化访问标记数组vis,所有节点初始为未访问
vector <bool> vis(MAXN, false);
// 初始化邻接表go,用于存储图的边信息
vector <vector <pair<int, int> > > go(MAXN);
// 读取每条边的信息(起点l,终点r(实际存储为r+1),权重w)
for(int i = 1; i <= m; i++) {
cin >> l >> r >> w;
// 存储边信息,注意终点为r+1
go[l].push_back(make_pair(r + 1, w));
// 添加反向边,权重为-w,用于处理类似最小费用流的问题(尽管这个程序中未直接使用此特性)
go[r + 1].push_back(make_pair(l, -w));
}
// 初始化BFS队列,并将起点1加入队列,同时标记为已访问,距离为0
queue <int> q;
dist[1] = 0, vis[1] = true;
q.push(1);
// 执行BFS,直到队列为空
while(!q.empty()) {
int x = q.front(); q.pop();
// 遍历节点x的所有邻接节点
for(auto i : go[x]) {
// 如果邻接节点未被访问过
if(!vis[i.first]) {
// 标记为已访问,并更新距离
vis[i.first] = true;
dist[i.first] = dist[x] + i.second;
// 将邻接节点加入队列
q.push(i.first);
}
}
}
// 检查终点n+1是否被访问到(注意终点也是n+1,而不是n)
if(dist[n + 1] == -1) cout << "sorry" << endl;
else cout << dist[n + 1] << endl;
return 0;
}