codeforces Round#158 Div.2 C

题意:

玩一个游戏,有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

codeforces Round#158 Div.2 C的相关文章

codeforces Round#158 Div.2 D

题意: 给出n个点的颜色,和与该点有关边的总权值,让你构造出一棵树,颜色相同的点不能相连,输出所有边和其权值 题解: http://m.blog.csdn.net/blog/haha593572013/8450520 代码: http://hzwer.com/7257.html

codeforces Round#158 Div.2 A

题意: 给出一个数字  ,  往其末尾加上n个数字,每次添加的时候保证其 %  k   == 0 输出最终数字 题解: 只需要保证第一个数字合法,  然后往后面加上n-1个0 代码 : #include<stdio.h> #include<string.h> int main() { int a, b, n; char s1[200010]; while(scanf("%d %d %d", &a, &b, &n) != EOF) { me

Codeforces Round #354 (Div. 2) ABCD

Codeforces Round #354 (Div. 2) Problems # Name     A Nicholas and Permutation standard input/output 1 s, 256 MB    x3384 B Pyramid of Glasses standard input/output 1 s, 256 MB    x1462 C Vasya and String standard input/output 1 s, 256 MB    x1393 D T

Codeforces Round #279 (Div. 2) ABCD

Codeforces Round #279 (Div. 2) 做得我都变绿了! Problems # Name     A Team Olympiad standard input/output 1 s, 256 MB  x2377 B Queue standard input/output 2 s, 256 MB  x1250 C Hacking Cypher standard input/output 1 s, 256 MB  x740 D Chocolate standard input/

Codeforces Round #366 (Div. 2) ABC

Codeforces Round #366 (Div. 2) A I hate that I love that I hate it水题 1 #I hate that I love that I hate it 2 n = int(raw_input()) 3 s = "" 4 a = ["I hate that ","I love that ", "I hate it","I love it"] 5 fo

Codeforces Round #428 (Div. 2)

Codeforces Round #428 (Div. 2) A    看懂题目意思就知道做了 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define rep(i,a,b) for (int i=a; i<=b; ++i) #define per(i,b,a) for (int i=b; i>=a; --i

Codeforces Round #424 (Div. 2) D. Office Keys(dp)

题目链接:Codeforces Round #424 (Div. 2) D. Office Keys 题意: 在一条轴上有n个人,和m个钥匙,门在s位置. 现在每个人走单位距离需要单位时间. 每个钥匙只能被一个人拿. 求全部的人拿到钥匙并且走到门的最短时间. 题解: 显然没有交叉的情况,因为如果交叉的话可能不是最优解. 然后考虑dp[i][j]表示第i个人拿了第j把钥匙,然后 dp[i][j]=max(val(i,j),min(dp[i-1][i-1~j]))   val(i,j)表示第i个人拿

Codeforces Round #424 (Div. 2) C. Jury Marks(乱搞)

题目链接:Codeforces Round #424 (Div. 2) C. Jury Marks 题意: 给你一个有n个数序列,现在让你确定一个x,使得x通过挨着加这个序列的每一个数能出现所有给出的k个数. 问合法的x有多少个.题目保证这k个数完全不同. 题解: 显然,要将这n个数求一下前缀和,并且排一下序,这样,能出现的数就可以表示为x+a,x+b,x+c了. 这里 x+a,x+b,x+c是递增的.这里我把这个序列叫做A序列 然后对于给出的k个数,我们也排一下序,这里我把它叫做B序列,如果我

[Codeforces] Round #352 (Div. 2)

人生不止眼前的狗血,还有远方的狗带 A题B题一如既往的丝帛题 A题题意:询问按照12345678910111213...的顺序排列下去第n(n<=10^3)个数是多少 题解:打表,输出 1 #include<bits/stdc++.h> 2 using namespace std; 3 int dig[10],A[1005]; 4 int main(){ 5 int aa=0; 6 for(int i=1;;i++){ 7 int x=i,dd=0; 8 while(x)dig[++dd