2 条题解

  • 0
    @ 2026-2-19 23:27:40
    #include<bits/stdc++.h>
    using namespace std;
    
    int main(){
    	int n;
    	cin >> n;
    	
    	int pos1 = 0, posn = 0; // [1] 分别记录编号1和编号n的书的位置
    	for(int i = 0; i < n; i++){
    		int x;
    		cin >> x;
    		if(x == 1) pos1 = i;   // [2] 定位编号1的书
    		if(x == n) posn = i;   // [3] 定位编号n的书
    	}
    	
    	int sum = pos1 + (n - 1 - posn); // [4] 计算基础移动次数
    	if(pos1 > posn) sum--;            // [5] 核心修正:若1在n右侧,总次数减1(1左移时推动了n)
    	
    	cout << sum;
    	return 0;
    }
    
    • 0
      @ 2026-2-19 23:25:48
      #include<bits/stdc++.h>
      using namespace std;
      
      // [1] 全局变量,存储书架上书的总数量
      int n;
      // [2] 全局数组,存储书架每个位置的书的编号,数组大小适配题目n≤1000的数据范围
      int arr[1100];
      
      int main(){
      	// [3] 定义位置变量:left记录编号1的书的位置,right记录编号n的书的位置
      	int left = 0 , right = 0;
      	// [4] 遍历输入的n本书,定位编号1和编号n的书的初始位置
      	for(int i = 0 ; i < n ; i++)
      	{
      		cin >> arr[i];  // [5] 读取书架第i个位置的书的编号
      		if(arr[i] == 1) left = i;  // [6] 找到编号1的书,记录其所在位置
      		if(arr[i] == n) right = i; // [7] 找到编号n的书,记录其所在位置
      	}
      	
      	// [8] 累加变量,记录机器人的总操作次数
      	int sum = 0;
      	// [9] 循环左移,将编号1的书移动到书架最左端(位置0)
      	while(left != 0)
      	{	
      		// [10] 核心处理:左移时若遇到编号n的书,同步更新n的位置(1左移会推动n右移1位)
      		if(arr[left - 1] == arr[right]) right++;
      		swap(arr[left] , arr[left - 1] ); // [11] 交换相邻两本书,完成一次左移操作
      		left--; // [12] 更新编号1的书左移后的新位置
      		sum++; // [13] 完成一次操作,总次数+1
      	}
      	
      	// [14] 循环右移,将编号n的书移动到书架最右端(位置n-1)
      	while(right != n-1)
      	{
      		swap(arr[right] , arr[right + 1] ); // [15] 交换相邻两本书,完成一次右移操作
      		right++; // [16] 更新编号n的书右移后的新位置
      		sum++; // [17] 完成一次操作,总次数+1
      	}
      	cout << sum; // [18] 输出整理书架的最小操作总次数
          return 0;
      }
      
      • 1

      信息

      ID
      1471
      时间
      1000ms
      内存
      256MiB
      难度
      10
      标签
      递交数
      1
      已通过
      1
      上传者