码迷,mamicode.com
首页 > 其他好文 > 详细

codeforces Round#158 Div.2 C

时间:2015-06-18 22:21:32      阅读:345      评论:0      收藏:0      [点我收藏+]

标签:

题意:

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


codeforces Round#158 Div.2 C

标签:

原文地址:http://blog.csdn.net/q651111937/article/details/46550979

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!