有n个房间,现在i号房间里的人需要被重新分配,分配的规则是这样的:先让i号房间里的人全都出来,接下来按照 i+1, i+2, i+3, ... 的顺序依此往这些房间里放一个人,n号房间的的下一个房间是1号房间,直到所有的人都被重新分配。
现在告诉你分配完后每个房间的人数以及最后一个人被分配的房间号x,你需要求出分配前每个房间的人数。数据保证一定有解,若有多解输出任意一个解。
有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个整数,代表每个房间分配前的人数。
3 1 6 5 1
4 4 4
#include <iostream> #include <vector> using namespace std; int main() { int n, x; cin >> n >> x; vector<long long> a(n,0); for(int i = 0; i < n; i++) scanf("%lld",&a[i]); long long min = a[0], minIndex = 0; for(int i = 1; i < n; i++) { if(min > a[i]) { min = a[i]; minIndex = i; } else if(min == a[i] && i <= x-1) { min = a[i]; minIndex = i; } } for(long long &i: a) i -= min; x--; if(minIndex == x) { a[minIndex] += n*min; } else if(minIndex < x) { for(int i = minIndex + 1; i <= x; i++) a[i]--; a[minIndex] += (n*min + x - minIndex); } else if(minIndex > x) { for(int i = minIndex + 1; i < n; i++) a[i]--; for(int i = 0; i <= x; i++) a[i]--; a[minIndex] += (n*min + x + n - minIndex); } //for(long long i : a) cout << i << " "; for(int i = 0; i < n; i++) printf("%lld ",a[i]); return 0; }18/20 组用例通过,还有两组不知道问题在哪里...
|