首页 > 试题广场 >

编程题2

[编程题]编程题2
  • 热度指数:626 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 64M,其他语言128M
  • 算法知识视频讲解

有n个房间,现在i号房间里的人需要被重新分配,分配的规则是这样的:先让i号房间里的人全都出来,接下来按照 i+1, i+2, i+3, ... 的顺序依此往这些房间里放一个人,n号房间的的下一个房间是1号房间,直到所有的人都被重新分配。

现在告诉你分配完后每个房间的人数以及最后一个人被分配的房间号x,你需要求出分配前每个房间的人数。数据保证一定有解,若有多解输出任意一个解。


输入描述:
第一行两个整数n, x (2<=n<=10^5, 1<=x<=n),代表房间房间数量以及最后一个人被分配的房间号;
第二行n个整数 a_i(0<=a_i<=10^9) ,代表每个房间分配后的人数。


输出描述:
输出n个整数,代表每个房间分配前的人数。
示例1

输入

3 1
6 5 1

输出

4 4 4
 
首先分析题目可知,i号房间的人数在分配完成后必然是最少的,先统计出最少的人数min(这说明循环了几轮),
让每个房间减去min以减少循环次数,从最后一个分配的房间循环往前推,记录次数count,在循环过程中第一个是0
的房间就是i号房间,其人数为min*n + count;
p.s要注意房间人数要用long int型
import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int n = 0 ,k = 0;
        Scanner a = new Scanner(System.in);
        n = a.nextInt();
        k = a.nextInt();
        long [] p = new long [n];
        for(int i = 0;i < n;i++) {
            p[i] = a.nextInt();
        }
        long min = p[0];
        for(int i = 0;i < n;i++) {
            if(p[i] < min)
                min = p[i];
        }
        for(int i = 0;i < n;i++) {
            p[i] = p[i] -min;
        }
        int count = 0;
        while(p[k-1] != 0)
        {
            p[k - 1]--;
            count++;
            if(k - 1 == 0)
                k = n;
            else
                k--;
        }
        p[k-1] = count + min * n;
        for(int i = 0;i < n;i++) {
            System.out.print(p[i]+" ");
        }
    }

}

发表于 2019-03-14 23:53:22 回复(1)
let n = 3,    // 房间数
        x = 1,  // 最后一个人加的房间号
        arr = [6, 5, 1]    // 个房间人数
      let min = Math.min(...arr)     // 找到房间内最少的人
      let tag = arr.indexOf(min)    // 房间最少的房间号
      let num = 0
      arr = arr.map((item, index) => {
        if (index > tag || index < x) {   // 大于房间号的房间和小于最后一个人加入的房间号
          num += min + 1
          return item - min - 1
        } else {
          num += min
          return item - min
        }
      })
      arr[tag] = num
      console.log(arr)
发表于 2022-10-13 19:28:42 回复(0)
const [n,x] = readline().split(" ").map((v)=>parseInt(v))
let list = readline().split(" ").map((v)=>parseInt(v))
const min = Math.min(...list) //最小值代表最少进行几轮循环
const minIndex = list.findIndex((v)=>v === min)
let k = 0 // i房间里的所有人数
let flag = false // 结束标识
if(min !== 0 ){
    list = list.map((v) => v - min) //跳过完整无意义的循环
    k = min*n
}
for(let i = 0; i <= 2 && !flag; i++) {
    let start = null //开始循环下标
    if(i === 0) { //第一次从结束位置逆序开始循环
        start = x - 1
    }
    else {//其他时候直接从末尾逆序循环
        start = n - 1
    }
    for(start; start >= 0; start--) {
        list[start]-- 
        if(list[start] <0 ){ //如果出现负数说明找到了起始点
            list[start]+= 1
            list[start]+= k 
            flag = true
            break
        }
        k++
    } 
}
print(list.join(' '))

发表于 2022-02-26 23:20:45 回复(0)
const rl = require('readline').createInterface({
    input: process.stdin,
    output: process.stdout
})
let home = -1, tag = -1

let after = []

rl.on('line', input => {
    if (home == -1) {
        let temp = input.split(' ')
        home = Number.parseInt(temp[0])
        tag = Number.parseInt(temp[1])
    } else {
        after = input.split(' ').map(it => Number.parseInt(it))

        let min = after.reduce((x, y) => x <= y ? x : y, after[0])

        // min 代表循环经过 i 多少次
        // tag 是最后停在的位置

        for (let i = 0; i < after.length; i++) {
            after[i] -= min
        }

        // 此时的情况等同于分配轮数还没到一圈
        let start = tag - 1, cnt = 0
        while (after[start] != 0) {
            // ...
            cnt++
            after[start]--

            start--
            if (start == -1) {
                start = after.length - 1
            }
        }

        after[start] = home * min + cnt

        console.log(after.join(' '))
    }
    
})

发表于 2021-04-23 16:12:33 回复(0)
var readline = require('readline')
const rl = readline.createInterface({
    input : process.stdin,
    output : process.stdout
})

var k = -1
var r = 0

rl.on('line',function(line){
    if(k==-1){
        k = line.split(' ')
    }else{
        r = line.split(' ')

        var j = k[1]-1;//最后一位在数组的位置
        var min = r[0]
        for (var i = 1i < r.lengthi++) {
             if(parseInt(r[i])<parseInt(min)){
                 min = r[i]
             }
        }
        if(min!=0){
            for (var i = 0i < r.lengthi++) {
                r[i] = r[i] - min
            }
        }
        var add = 0;
        var i = j
        while(i != j+1){
            if(i==-1){
                i = r.length-1
            }
            if (r[i]==0) {
                break
            }
            r[i]--;
            add++;
            i--;
        }
        r[i]=add+r.length*min
        str = r.join(' ');
        console.log(str);

        k = -1
        r = 0
    }
})
发表于 2021-04-11 13:32:22 回复(0)
def room(n, x, a):
    b = a[x:] + a[:x]//x号房间之后表示最后一次循环没有分配人的房间号,x号之前表示最后一次循环分配了人的房间号
    b.reverse()//从最后一个分配的房间开始向前推算
    m = min(b)
    i = b.index(m)//人数最少的房间就是i号房间
    for j in range(n):
        b[j] -= m//每个房间的人数减去i号房间的人数,因为循环一次,i号房间的人数就加1
    for j in range(0,i):
        b[j] -= 1//在i号房间前面的房间就是循环的房间,即未完成整个循环的房间,这种房间人数减1
    b[i] = i+m*n//i号房间的人数等于循环次数+分配后的人数*房间个数
    b.reverse()
    b = b[n-x:] + b[:n-x]
    for i in b:
        print(i, end = ' ')

if __name__=="__main__":
    n,x=map(int,input().split())
    arr=list(map(int,input().split()))
    room(n,x,arr)

发表于 2020-08-22 16:01:55 回复(0)

let [n, x] = readline().split(' ')
let arr = readline().split(' ')
let people = 0
let index = x - 1
let min = arr[0]
for (let i = 1; i < n; i ++) {
  if (Number(arr[i]) < Number(min)) {
    min = arr[i]
  }
}
arr = arr.map(item => item - min)
while(arr[index] !== 0 ) {
  arr[index] = arr[index] - 1
  people ++
  if (index === 0 ){
    index = n - 1
  } else {
    index --
  }
}
arr[index] = people + n*min
let res = ''
arr.forEach(item => {
   res += item + ' '
})
print(res)
编辑于 2019-04-14 09:14:01 回复(0)
var readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
const lines = [];
var n = -1;
var x;
var rooms = [];
rl.on('line', function multiply(line){
    if (n == -1) {
        var temp = line.split(' ');
        n = Number(temp[0]);
        x = Number(temp[1]);
    } else {
        rooms = line.trim().split(' ');
        var min = Number(rooms[0]);
        for (let i = 0; i < rooms.length; i++) {
            if (Number(rooms[i]) < min) {
                min = Number(rooms[i]);
            }
        }
        rooms = rooms.map(function(item) {return item - min;});
        var count = 0;
        var previous = x;
        while (rooms[previous-1] != 0) {
            rooms[previous-1]--;
            count++;
            previous--;
            if (previous ==0) {
                previous = n;
            }
        } 
        rooms[previous-1] = count + min*n;
        var result = rooms.join(' ');
        console.log(result);
    }
});

发表于 2019-03-15 22:02:29 回复(0)
var str=readline();
var arr=str.split(" ");
var houseCount=arr[0];//房间数
var lastHouse=arr[1];//最后一个人的房间
str=readline();
var houseArr=str.split(" ");
var people=0;//被分房间的人数
var index=lastHouse-1;//计算数组下标
while(houseArr[index]!=0){//倒推房间,直到有房间人数为0
    houseArr[index]=houseArr[index]-1;
    people++;
    index--;
    if(index<0){
        index=houseCount-1;//下标循环
    }
}
houseArr[index]=people;
var strOutput="";
for(var j=0;j<houseCount;j++){
    strOutput+=houseArr[j]+" "
}
console.log(strOutput);


发表于 2019-03-14 01:36:56 回复(1)
#include<stdio.h>
#include<stdlib.h>
intmain(){
    int*a,n,x,i;
    intnum=0;
    scanf("%d %d",&n,&x);
    a=(int*)malloc(n*sizeof(int));
    for(i=0;i<n;i++){
        scanf("%d",&a[i]);
    }
    i=x-1;
    while(a[i]!=0){
        a[i]=a[i]-1;
        num++;
        i--;
        if(i<0){
            i=n-1;
        }
    }
    a[i]=num;
    for(i=0;i<n;i++){
        printf("%d ",a[i]);
    }
     
}

发表于 2018-08-11 14:11:57 回复(0)