codeforces Round#158 Div.2 C

来源:互联网 发布:云南大学网络平台 编辑:程序博客网 时间:2024/05/16 11:33

题意:

玩一个游戏,有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");    }}


0 0
原创粉丝点击