zoukankan      html  css  js  c++  java
  • 常州模拟赛d4t1 立方体

    题目描述

    立方体有 6 个面,每个面上有一只奶牛,每只奶牛都有一些干草。为了训练奶牛的合作精神,它

    们在玩一个游戏,每轮:所有奶牛将自己的干草分成 4 等份,分给相邻的 4 个面上的奶牛。

    游戏开始,给定每个面上奶牛的干草数量,k 轮游戏后,请问奶牛 Shary 拥有的干草数量是多

    少? 奶牛在立方体上编号次序是:前、后、上、下、左、右,奶牛 Shary 在立方体的上面。

    如果答案是整数,直接输出;答案可能是分数,用最简分式表示,格式为 X/Y。

    例如:一开始 6 个奶牛的干草数量是:0,0,4,0,0,0。Shary 开始有干草数量是 4,其他奶

    牛没有。游戏一轮以后,各个奶牛的干草数为:1,1,0,0,1,1;二轮以后各个奶牛的干草数为:

    1/2,1/2,1,1,1/2,1/2。

    输入输出格式

    输入格式:

    第一行包含 6 个整数 A i ,表示 6 只奶牛开始时拥有的干草数量。

    第二行包含 1 个整数 k,表示游戏要进行的轮数。

    输出格式:

    如果答案是整数,则答案共一行包含一个整数;如果答案是分数,则答案共一行包含一个最简分

    式(无空格)。

    输入输出样例

    输入样例#1:
    0 0 4 0 0 0
    2
    输出样例#1:
    1

    说明

    对于 30% 的数据:保证任意时刻每只奶牛拥有的干草数量为整数;

    对于 100% 的数据:0 ≤ A i ≤ 1000,0 ≤ k ≤ 45。

    分析:一道大模拟,就是分数加减法,不过要注意每次运算完都必须要约分,而且求最小公倍数要先除后乘,否则会爆long long.

    #include <bits/stdc++.h>
    
    using namespace std;
    
    int k; 
    
    long long gcd(long long x,long long y)
    {
        if (!y)
        return x;
        return gcd(y,x % y);
    }
    
    struct node
    {
       long long a,b;    
    }e[10];
    
    struct node2
    {
        long long a,b;
    }e2[10];
    
    node add(node2 x,node y)
    {
        long long temp = gcd(x.b,y.b);
        long long lcm = x.b / temp * y.b;
        x.a *= (lcm / x.b);
        y.a *= (lcm / y.b);
        node tt;
        tt.a = x.a + y.a;
        tt.b = lcm;
        if (tt.a != 0)
        {
        long long t = gcd(tt.a,tt.b);
        tt.a /= t;
        tt.b /= t;
        }
        
        return tt;
    }
    
    int main()
    {
        //前 --- 上下左右  1  3456
        //后 --- 上下左右  2  3456
        //上 --- 前后左右  3  1256
        //下 --- 前后左右  4  1256
        //左 --- 上下前后  5  1234
        //右 --- 上下前后  6  1234
        cin >> e[1].a >> e[2].a >> e[3].a >> e[4].a >> e[5].a >> e[6].a >> k;
        for (int i = 1; i <= 6; i++)
        e[i].b = 1;
        while (k--)
        {
            for (int i = 1; i <= 6; i++)
            {
                e2[i].a = e[i].a;
                e2[i].b = e[i].b;
                e2[i].b *= 4;
                e[i].a = 0;
                e[i].b = 1;
                //printf("%d %d
    ",e2[i].a,e2[i].b);
                if (e2[i].a != 0)
                {
                int t = gcd(e2[i].a,e2[i].b);
                e2[i].a /= t;
                e2[i].b /= t;
            }
            }
            for (int i = 1; i <= 6; i++)
            {
                if (i == 1 || i == 2)
                {
                    for (int j = 3; j <= 6; j++)
                    {
                        node t = add(e2[i],e[j]);
                        e[j].a = t.a;
                        e[j].b = t.b;
                    }
                }
                else
                if (i == 3 || i == 4)
                {
                    for (int j = 1; j <= 2; j++)
                    {
                        node t = add(e2[i],e[j]);
                        e[j].a = t.a;
                        e[j].b = t.b;
                    }
                    for (int j = 5; j <= 6; j++)
                    {
                        node t = add(e2[i],e[j]);
                        e[j].a = t.a;
                        e[j].b = t.b;
                    }
                }
                else
                if (i == 5 || i == 6)
                {
                    for (int j = 1; j <= 4; j++)
                    {
                        node t = add(e2[i],e[j]);
                        e[j].a = t.a;
                        e[j].b = t.b;
                    }
                }
            }
        }
        if (e[3].a % e[3].b == 0)
        cout << e[3].a / e[3].b << endl;
        else
        cout << e[3].a << '/' << e[3].b << endl;
        
        return 0;
    }
  • 相关阅读:
    数据分析之Anaconda安装
    算法作业三
    算法作业二
    html
    qingdao
    hdu 123
    排序作业
    hdu 5614
    hdu 456
    poj 3140 树形去边差异最小
  • 原文地址:https://www.cnblogs.com/zbtrs/p/7424775.html
Copyright © 2011-2022 走看看