题意:
玩一个游戏,有n个箱子, 每个箱子里面有value[i] 个小球, 选择其中一个箱子开始游戏,将这个箱子里面小球全部拿出,该箱子编号为i , 然后依次朝着i + 1 , i + 2 ....... 箱子里放球,一次放一个 , 直到把手上的球全部放完, 最后一个球的后面一个球为第一个球。
现在给你最终游戏结束的状态,并且给你游戏结束的时候放最后一个球的位置,让你推测出游戏刚刚开始的时候的状态
题解:
找到结束状态中球最少的箱子编号,很明显是从该箱子开始游戏,然后模拟 , 没了
代码:
#include<stdio.h> int main() { int n, m; __int64 value[100005]; while(scanf("%d %d", &n, &m) != EOF) { for(int i = 1; i <= n; i++) scanf("%I64d", &value[i]); int Min = 1000000005, Mini = -1; for(int i = m; i >= 1; i--) if(value[i] < Min) Min = value[i], Mini = i; for(int i = n; i > m; i--) if(value[i] < Min) Min = value[i], Mini = i; // printf("%d\n", Mini); if(!Min) { if(Mini > m) { __int64 num = 0; for(int i = Mini + 1; i <= n; i++) num ++, value[i] --; for(int i = 1; i <= m; i++) num ++, value[i] --; value[Mini] = num; } else { __int64 num = 0; for(int i = Mini + 1; i <= m; i++) num ++, value[i] --; value[Mini] = num; } } else { if(Mini > m) { __int64 num = 0, k = value[Mini]; for(int i = Mini + 1; i <= n; i++) num += (k + 1), value[i] -= (k + 1); for(int i = 1; i <= m; i++) num += (k + 1), value[i] -= (k + 1); for(int i = m + 1; i <= Mini; i++) num += (k), value[i] -= k; value[Mini] = num; } else { __int64 num = 0, k = value[Mini]; for(int i = 1; i <= Mini; i++) num += k, value[i] -= k; for(int i = Mini + 1; i <= m; i++) num += (k+1), value[i] -= (k+1); // printf("%d\n", num); for(int i = m + 1; i <= n; i++) num += k, value[i] -= k; value[Mini] = num; } } printf("%I64d", value[1]); for(int i = 2; i <= n; i++) printf(" %I64d", value[i]); printf("\n"); } }
时间: 2024-10-11 03:43:04