有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
1651
輸出例子1:4
44
初始情況:4 4 4
現在第3房間的人重新分配
(為了與語言一致,即使得房間編號從0開始,**中會認為是2號房間
4 4 0
1 1 1
最終結果為
6 5 1
因為如果出現2個或者2個以上的最小值相等的情況,那麼就說明i房間當中的人數無法分配一圈
,一旦i房間中的人數可以分配一圈,那麼i房間的人數增加1,其他所有房間都增加1,不可能出現相等的情況
,所以如果出現多個相同的最小值的時候以終止房間x遞減到第乙個對應的最小值為準
#include
using
namespace std;
intmain()
//題目中的房間號是從1開始的,所以-1
int index = x -1;
//用來儲存沒有轉完一圈剩下的房間數,即x到i房間的距離,圖中的d
int count =0;
//開始,(index + n) % n的原因是index是不斷減小的,因為在分配i房間人數時是以
//i,i + 1,....,n,1,2,...i這種順序的,所以我們是反著來還原的,即
//index,index - 1,....1,0,n,n - 1,....index,所以是為了防止越界訪問
//!= min_value目的有兩個:
//1.因為我們是以index遞減的順序遍歷的,那麼第乙個和min_val值相等的房間
//剛好就是題目中的i號房間,也就是把人數拿出來分配的房間,避免了相同的min_val
//情況;
//2.從index遞減到第乙個等於min_val房間之間的所有房間一定是至少分配了
//min_val + 1個人,也就是圖中的紅色部分,+ 1就是紅色部分比藍色部分
//多走的半圈
while
(person_now[
(index + n)
% n]
!= min_value)
//還原第i號房間的原始人數,就是最少房間的人數
person_now[
(index + n)
% n]
= min_value * n + count;
index--
;//還原圖中的藍色部分的原始人數,就是只分配了min_val個人數,最後沒走完
//一圈剩下的房間數
while
((index + n)
% n != x -1)
//列印結果
for(
int i =
0; i < n; i++
)return0;
}
程式設計題房間分配
時間限制 1秒 空間限制 65536k 有n個房間,現在i號房間裡的人需要被重新分配,分配的規則是這樣的 先讓i號房間裡的人全都出來,接下來按照 i 1,i 2,i 3,的順序依此往這些房間裡放乙個人,n號房間的的下乙個房間是1號房間,直到所有的人都被重新分配。現在告訴你分配完後每個房間的人數以及最...
codevs2072 分配房間
題目描述 description yh擁有一條街道,街道上共有n間房子,每間房子的座標為xi yh的房子比較神奇,可能重疊 同時,yh有m個女朋友 這是事實 yh打算給每位女朋友分配一間房子。兩個女朋友間的距離相隔越近,她們之間產生衝突的可能就越高。yh想盡可能的減小女朋友間的衝突,於是他打算讓他的...
CODEVS 2702 分配房間
題目描述 description yh擁有一條街道,街道上共有n間房子,每間房子的座標為xi yh的房子比較神奇,可能重疊 同時,yh有m個女朋友 這是事實 yh打算給每位女朋友分配一間房子。兩個女朋友間的距離相隔越近,她們之間產生衝突的可能就越高。yh想盡可能的減小女朋友間的衝突,於是他打算讓他的...