洛谷SCP 2024 第一轮(初赛 J 组)模拟题解析(第二部分:阅读程序(1-3))

程序一代码:

 #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;  
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值