首页 > 试题广场 >

大巴车(数组分块,按块翻转,块内不变)

[编程题]大巴车(数组分块,按块翻转,块内不变)
  • 热度指数:5699 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
某天猿辅导 HR 组织大家去漂流,早上,参加团建的同学都到齐了,并且按到达公司的先后顺序排好队了。 由于员工太多,一个大巴车坐不下,需要分多个车,车是足够的,但所有人需要按一定顺序上车,按如下规则安排上车的顺序:
假设大巴车容量为 m,从队首开始,每 m 个人分成一个小组,每个小组坐一辆车。同时只有一个车打开车门供员工上车。 小组之间按从队尾到队首顺序依次上车,同一小组内先到的同学先上,求所有人上车的顺序。

例如: 员工数 8, 车容量 3, 员工到达顺序为 1 2 3 4 5 6 7 8, 3个人一个小组,分三个小组, 小组一: 1, 2, 3, 小组二: 4, 5, 6,小组三: 7,8。 小组上车顺序为: 小组三,小组二,小组一 。 所有员工上车顺序为 7 8 4 5 6 1 2 3

#include <iostream>

int main() {
    int memberCount, carCount;
    std::cin >> memberCount;
    std::cin >> carCount;
    
    int* members = new int[memberCount];
    for (int i = 0; i < memberCount; i++) {
        std::cin >> members[i];
    }
    

    // TODO: 按规则调整顺序
    while(true)
    {
        // TODO: 输出,注意有空格隔开
        std::cout << orders[i];
    }
    
    delete[] members;
    delete[] orders;
}


输入描述:
第一行: 员工数和大巴容量
第二行: 所有员工工号(按到达顺序)


输出描述:
员工编号
示例1

输入

5 3
1 3 5 2 4

输出

2 4 1 3 5
    /*思路就是只利用数组来完成
     * 比如 员工到达顺序为 1 2 3 4 5 6 7 8
     * 车容量为3个人
     * 所以是3组
     * 现在数组存的就是 int[] ps={1 2 3 4 5 6 7 8};
     * 分为三组的情况下:
     * 第一组123第二组456第三组78
     * 所以只需将每一组中的设置两个标识位begin和end,
     * 然后将begin和end值互换即可
     * 比如第一组123,开始时begin=0,end=2,然后将ps[0]和ps[2]互换
     * 然后再将begin++,end--。
     * 互换的次数就有每一组的数量来决定=每一组的数量/2
     * 最终每一组互换之后就会得到3 2 1 6 5 4 8 7
     * 只需再倒序输出即可
     */
    
    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        //员工数量
        int pNum=sc.nextInt();
        //车的容纳量
       int cNum=sc.nextInt();
       //将用户输入的员工放置到ps数组中
        int[] ps=new int[pNum];
        for(int i=0;i<pNum;i++){
            ps[i]=sc.nextInt();
        }
        //大巴车数量
        int a=(pNum%cNum)==0?pNum/cNum:pNum/cNum+1;
        int flag,temp;
        //flag存储每一组要进行交换的次数=车的容纳量/2
        flag=cNum/2;
        //开始对每一组进行交换
        for(int i=0;i<a;i++){
            //交换的开始下标
            int begin=i*cNum;
          //交换的结束下标
            int end=0;
            //这个判断是为了计算最后一组的数量,因为最后一组的数量可能小于车的容纳量
            if((i*cNum+cNum-1)<(ps.length))
             end=i*cNum+cNum-1;
            else
             end=ps.length-1;
            //开始对每一组中的值进行交换
            for(int j=0;j<flag;j++){
                temp=ps[begin];
                ps[begin]=ps[end];
                ps[end]=temp;
                begin++;
                end--;
            }
        }
        //倒序输出
        int max=ps.length-1;
        for(int i=max;i>=0;i--) {
            System.out.print(ps[i]+" ");
        }
    }

编辑于 2019-02-28 18:38:00 回复(0)
#include <bits/stdc++.h>
using namespace std;

int main(){
    int n,m;
    cin>>n>>m;
    int a[n];
    for(int i=0;i<n;i++)    
        cin>>a[i];
    int t = n/m*m, k=n;
    for(int i=t;i>=0;i-=m){
        for(int j=i;j<k;j++)
            cout<<a[j]<<" ";
        k = i;
    }
    return 0;
}

发表于 2019-11-08 02:01:50 回复(2)
package com.bean;

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        //小组几个人
        int MemberNum = sc.nextInt();
        //公交容量
        int BusCapacity = sc.nextInt();
        //有几人开辟多大空间,因为普通数组并不支持动态扩展
        int[] arr = new int[MemberNum];
        //依次入数组
        for (int i = 0; i < MemberNum; i++) {
            arr[i] = sc.nextInt();
        }
        //总共几个组(余1就多加一辆车,不能因为多一个人就省一辆车)
        int groupNum = MemberNum % BusCapacity == 0 ? MemberNum/BusCapacity:MemberNum/BusCapacity+1;
        //从最后一组开始,递减输出
        for (int i = groupNum-1; i >= 0; i--) {
            //最后一组的车有可能坐不满,所以循环条件为小于总容量即可
            if(i == groupNum-1) {
                for (int j = i * BusCapacity;j>=0 && j < MemberNum;j++){
                    System.out.print(arr[j] + " ");
                }
                //除了最后一组其他组肯定都是满员的
            }else {
                for (int j = i * BusCapacity; j < (i+1) * BusCapacity; j++) {
                    //最后一位去掉空格(强迫症,emmm)
                    if (j == BusCapacity-1)
                        System.out.print(arr[j]+"");
                    else
                        System.out.print(arr[j]+" ");
                }
            }
        }

    }
}
编辑于 2019-07-30 21:52:57 回复(0)
#include <iostream>
#include <queue>
#include <vector>
using namespace std;

int main(){
    int m, n, ID;
    cin >> m >> n;
    queue<int> id;
    for(int i = 0; i < m; ++i){
        cin >> ID;
        id.push(ID);
    }
    vector<queue<int>> res;
    queue<int> temp;
    int ct = 0;
    for(int i = 0; i < m; ++i){
       //分组
        temp.push(id.front());
        id.pop();
        ++ct;        
        if(ct == n || i == m - 1){  //到达车的容量 或者 不到最大容量的最后那部分
            ct = 0;
            res.push_back(temp);
            temp = queue<int>();
        }

    }
    int len = res.size();
    for(int i = len - 1; i >= 0; --i){
        while(res[i].size()){
            cout << res[i].front() << ' ';
            res[i].pop();
        }
    }
    cout << endl;
    return 0;
}

编辑于 2020-06-01 22:59:42 回复(0)
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n,m;
    cin>>n>>m;
    int* p=new int[n];
    for(int i=0;i<n;i++)
    {
        cin>>p[i];
    }
    int k=n/m;
    while(k>=0)
    {
        for(int i=k*m;i<min(k*m+m,n);i++)
            cout<<p[i]<<" ";
        k--;
    }
    delete[] p;
}

发表于 2020-02-19 08:29:13 回复(0)

import java.util.Scanner;

public class orderBus{

    

    public static void main(String[] args){

        Scanner in = new Scanner(System.in);

        //员工数量

        int totalNumber = in.nextInt();

        //车的容量

        int capacOfBus = in.nextInt();

        

        int [] store_number = new int[totalNumber];

        for(int i =0; i<totalNumber; i++){

            store_number[i] = in.nextInt();

            System.out.println("each turn, the number is " + store_number[i]);

        }

        

        //大巴车数量

        int bus_number =(totalNumber%capacOfBus)==0?totalNumber/capacOfBus:totalNumber/capacOfBus+1;

        

        for(int j=bus_number-1;j>=0;j--) {

            if(j == bus_number-1) {

                int k = totalNumber- j*capacOfBus;

                for(int m=0;m<k;m++) {

                    System.out.print(store_number[totalNumber-k+m] + " ");

                }

            }

            else {

                for(int m=0;m<capacOfBus;m++) {

                    System.out.print(store_number[capacOfBus*j+m] + " ");

                }

            }


        }

        

        

    }

}


发表于 2019-08-04 10:54:18 回复(1)
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String strOne = sc.nextLine();
		String strTwo = sc.nextLine();
		sc.close();
		
		String[] arrayOne = strOne.split(" ");//员工数 + 大巴容量
		int empNum = Integer.parseInt(arrayOne[0]);//员工数
		int busSeat = Integer.parseInt(arrayOne[1]);//大巴容量
		String[] arrayTwo = strTwo.split(" ");//老数组: 所有员工工号(按到达顺序)
		int busCount = empNum / busSeat;//所需大巴车数量(下标从0开始)
		int lessEmpCount = empNum % busSeat;//坐不满一辆车的员工数
		int[] arrayEmpCode = new int[empNum];//新数组:员工编号作为上车顺序
		int empCount = 0;
		
		//处理老数组:数组分块,按块翻转,块内不变
		for(int i = busCount; i >= 0; i--){
			int maxJ;
			if(i == busCount){
				maxJ = lessEmpCount;
			}else{
				maxJ = busSeat;
			}
			for(int j = 0; j < maxJ;j++){
				arrayEmpCode[empCount++] = Integer.parseInt(arrayTwo[i * busSeat + j]);
				
			}
		}
		
		//输出新的数组,注意空格的格式
		for(int k = 0; k < empNum;){
			System.out.print(arrayEmpCode[k++]);
			if(k > 0 && k < empNum){
				System.out.print(" ");
			}
		}
		
		
	}

}

发表于 2020-07-22 14:12:31 回复(0)
num,size =map(int,input().split())
l =list(map(int,input().split()))
index =num//size-1
whilenum !=0:
    ifnum%size !=0:
        fori inrange(num-num%size,num):
            print(l[i],end=' ')
        num =num-num%size
    fori inrange(size*index,size*(index+1)):
        print(l[i],end=" ")
    index-=1
    num-=size
发表于 2020-07-05 20:07:57 回复(0)
很原始的方法,不好勿喷
/*
我认为关键点在于从哪里开始上车,利用n/m    商表示循环的次数,余数表示最后面不能满载的人,
*/
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();//员工数
        int m = input.nextInt();//车容量
        int[] arr = new int[n];
        for(int i = 0;i<n;i++)
            arr[i] = input.nextInt();
        
        int[] num =new int[n];
        int shang = n/m;//保留商
        int yu = n%m;//保留余数
        int begin = n;//记录将数组arr复制到num的起始索引
        int k = 0;//
        boolean flag = true;
        for(int i =1;i<=shang;i++){
            if(yu !=0&&flag){//只进来一次
                for(int j=begin-yu;j<n;j++)
                    num[k++] = arr[j];
                begin = begin -yu;
                flag = false;
            }
            for(int a = begin-i*m;a<(begin-i*m + m);a++){
                num[k++] = arr[a];
            }
        }
        
        for(int i=0;i<n;i++){
            System.out.print(num[i]);
            if(i!=n-1)
                System.out.print(" ");
        }
    }
}


发表于 2020-04-22 12:00:45 回复(0)
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text.RegularExpressions;

//总结目前牛客问题 第一,没有循环输入问题, 第二 有循环输入问题, 第三 输入有多余空格问题 ,第四 中间插入多余空行问题 ....
namespace Test0001
{
    class Program
    {
        public static void Main(string[] args)
        {
            //string line;
            //while (!string.IsNullOrEmpty(line = Console.ReadLine())) Func(line);
            Func(Console.ReadLine());
        }
        public static void Func(string line)
        {
            var s1 = line.Trim().Split(' ').Select(x => int.Parse(x)).ToArray();
            int n = s1[0], m = s1[1];
            var s2 = Console.ReadLine().Trim().Split(' ').Select(x => int.Parse(x)).ToArray();
            Func2(n, m, s2);
        }
        
        public static void Func2(int n,int m, int[] s2)
        {
            int count = (n + m - 1) / m;
            int start = s2.Length, end;
            while (count>0)
            {
                end = start-1;
                start = --count * m;
                for (int i = start; i <= end; i++)
                {
                    Console.Write(s2[i] + " ");
                }
            }
        }
    }
}
首先求出要分成count组 然后 start指针移动到 count*m 尾指针 end 移动到上次的start-1
之后每次 --count 直到 count==0为止 循环输出即可
发表于 2019-12-10 17:47:55 回复(0)
本题也是很直观简单的一道题,由题可知还是由前到后的以m个依次分组,到最后一个不足m也可。
只不过输出时要从最后一组开始反着输出(组内顺序不变)。所以简单的使用两个下标i,pre_i,
分别表示当前组的开头,和上一组的开头。
#include<iostream>
#include<vector>
using namespace std;

int main()
{
    int n,m;
    cin>>n>>m;
    int tmp;
    vector<int> input;
    for(int i=0;i<n;i++)
    {
        cin>>tmp;
        input.push_back(tmp);
    }
    int i=0;
    while(i<n){
        i+=m;
    }
    int pre_i=n;
    i=i-m;
    while(i>=0)
    {
        for(int k=i;k<pre_i;k++)
            cout<<input[k]<<' ';
        pre_i=i;
        i-=m;
    }
}

发表于 2019-10-16 15:01:00 回复(0)
#include <bits/stdc++.h>
using namespace std;
int main(){
    int n,m,length,index=0,group[100][100]={0};
    cin>>n>>m;
    length = n%m==0 ? n/m : n/m+1;
    for(int i=0;i<n;i++)
    {
        if(i!=0&&i%m==0)
            index++;
        cin>>group[index][i%m];
    }
    while(length--)
        for(int j=0;j<m;j++)
            if(group[length][j]!=0)
                cout<<group[length][j]<<" ";
    return 0;
}

发表于 2019-09-08 21:25:01 回复(0)
#include<bits/stdc++.h>
using namespace std;
int main() {
	int n = 0;
	int m = 0;
	cin >> n >> m;
	vector<int> arr(n + 1, 0);
	for (int i = 1; i < n + 1; i++) {
		cin >> arr[i];
	}
	int tmp = n / m;
	while (tmp >= 0) {
		for (int i = (tmp * m + 1); i < (tmp + 1) * m + 1; i++) {
			if(i > n)
				break;
			cout << arr[i] << " ";
			if(i == n){
				break;
			}
		}
        tmp--;
	}
	return 0;
}

发表于 2019-08-31 12:54:55 回复(0)
public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        int m = in.nextInt();
        int[] a = new int[n];
        for (int i=0;i<n;i++)
            a[i] = in.nextInt();
        if (m < a.length){
            int from = 0,to = m-1;
            while (from < a.length){
                reverse(a,from,to);
                from += m;
                to += m;
                if (to >= a.length)
                    to = a.length-1;
            }
            reverse(a,0,a.length-1);
        }
        for (int i=0;i<a.length;i++)
            System.out.print(a[i]+" ");
    }

    public static void reverse(int[] a,int from,int to){
        int temp;
        while (from < to){
            temp = a[from];
            a[from] = a[to];
            a[to] = temp;
            from++;to--;
        }
    }
}

编辑于 2019-08-15 17:03:56 回复(0)
#模拟题
list = [int(x) for x in input().strip().split()]
n = list[0]
m = list[1]
list2 = [int(x) for x in input().strip().split()]
index = 1
all_bus = []
while (index-1)*m < n:
    one_bus = list2[(index - 1)*m:min(n,index*m)]
    all_bus.append(one_bus)
    index += 1
for i in range(len(all_bus)-1,-1,-1):
    for j in range(len(all_bus[i])):
        print(all_bus[i][j],end=" ")
发表于 2019-08-14 11:53:47 回复(0)
就在我写完这个代码之后我考虑到了用二维数组,但是已经这么写完了  两个编程题都是用最笨的方法
public class Main {
    public void travle(int count, int volumn, int[] order) {
        int num = count / volumn;
        if (count % volumn == 0) {
            int index = 0;
            for (int i = 0; i < num; i++) {
                for (int j = count - (volumn * (i + 1));; j++) {
                    System.out.print(order[j] + " ");
                    index++;
                    if (index == volumn) {
                        index = 0;
                        break;
                    }
                }
            }
        } else {
            int tail = count % volumn;
            int lastIndex = count - tail;
            for (int a = lastIndex; a < order.length; a++) {
                System.out.print(order[a] + " ");
            }
            int index = 0;
            for (int i = 0; i < num; i++) {
                for (int j = count - tail - (volumn * (i + 1));; j++) {
                    System.out.print(order[j] + " ");
                    index++;
                    if (index == volumn) {
                        index = 0;
                        break;
                    }
                }
            }
        }
    }

    public static void main(String[] args) {
//         Scanner scanner = new Scanner(System.in);
//         String line = scanner.nextLine();
//         String[] words = line.split(" ");
//         int count = Integer.parseInt(words[0]);
//         int volumn = Integer.parseInt(words[1]);
//         Scanner scanner2 = new Scanner(System.in);
//         String line2 = scanner.nextLine();
//         String[] words2 = line.split(" ");
//         int[] order = new int[words2.length];
//         for(int i = 0;i<words2.length;i++){
//         order[i] = Integer.parseInt(words[i]);
//         }
        Main test = new Main();
        int[] i = { 1, 2, 3, 4 ,5,6,7,8 };
        test.travle(8, 3, i);

    }
}
发表于 2019-07-31 19:13:39 回复(0)
import java.util.*;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int memberCount = scanner.nextInt();
        int m = scanner.nextInt();
        int[] arrive = new int[memberCount];
        for (int i = 0; i < memberCount; i++) {
            arrive[i] = scanner.nextInt();
        }
        // 例如8个人车容量3,则上车第一人下标为为8/3*3=6
        int start = memberCount / m * m;
        // 第一组最后一人下标为8-1=7,即第一组上车为{6,7}
        int end = memberCount - 1;
        int index = start;
        for (int i = 1; i <= memberCount; i++) {
            if (index > end) {
                // 当index循环完第一组,则将start减去m,例子中为6-3=3
                index = start -= m;
                // end做相应改变,3+3-1=5,即第二组为{3,4,5}
                end = start + m - 1;
            }
            System.out.print(arrive[index++] + " ");
        }
    }
}
发表于 2019-07-05 09:57:47 回复(0)
✭头像
import sys
line1 = sys.stdin.readline().strip()
n, m =map(eval, line1.split())
line2 = sys.stdin.readline().strip()
ls = line2.split()
ll = []
sum = 0
x = 0
for i in range(n):
    if(x > n-1):
        break
    if(sum==m or (x+sum)==n-1):
        ll.append(ls[x:x+sum])
        x+=sum
    else:
        sum+=1
for j in ll[::-1]:
    for k in j:
        print(k,end=" ")
print()

发表于 2019-08-28 12:15:46 回复(0)
package main

import (
    "fmt"
)

func main() {
    var n,m int
    fmt.Scan(&n,&m)
    arr:=[]int{}
    child:=[]int{}
    var x int
    for i:=0;i<n;i++{
        fmt.Scan(&x)
        child=append(child,x)
        if len(child)==m||i==n-1{
            tmp:=make([]int,len(child))
            copy(tmp,child)
            arr=append(tmp,arr...)
            child=[]int{}
        }
    }
    for _,x:=range arr{
        fmt.Printf("%d ",x)
    }
}

发表于 2023-03-12 02:33:51 回复(0)
public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
            int mem=sc.nextInt();
            int car=sc.nextInt();
            int[] mems=new int[mem];
            for(int i=0;i<mem;i++){
                mems[i]=sc.nextInt();
            }
            
            int n=mem/car;
            for(int i=n*car;i<mem;i++){
                System.out.print(mems[i]+" ");
            }
             for(int i=n-1;i>=0;i--) {
                for(int j=0;j<car;j++)
                    System.out.print(mems[i*car+j]+" ");
            }
            System.out.println();
        }
        sc.close();
    }

发表于 2021-01-09 20:56:15 回复(0)