P8874的15测试点是什么,怎么好多都通不过
  • 板块灌水区
  • 楼主jacobcn
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/11/2 17:35
  • 上次更新2024/11/2 19:59:27
查看原帖
P8874的15测试点是什么,怎么好多都通不过
650471
jacobcn楼主2024/11/2 17:35
//用例
//1:输入:
//  输出:
//2:输入:
//  输出:
//3:输入:
//  输出:
//4:输入:
//  输出:
//5:输入:
//  输出:
//核心代码
//for循环
#include <bits/stdc++.h>
using namespace std;
//#define int long long
int main()
{
    #ifndef ONLINE_JUDGE
    freopen("data/P8874/P8874.in","r",stdin);
    freopen("data/P8874/P8874_2.out","w",stdout);
    #endif
    int n, m, q, l;
    cin >> n >> m >> q >> l;
    long long c[n][l]; // 每层建筑的钱
    long long player_money[2]; // 玩家的钱
    int player_pos[2]; // 玩家的位置
    int b_level[n]; // 每个建筑的级别
    long long b_money[n]; // 每个建筑物当前的费用
    int b_owner[n]; // 每个建筑的所有者
    long long d[n]; // 每个建筑的周期费用
    int cur_player = -1; // 当前玩家,0是renko,1是merry,cur_player ^ 1就表示另外一个玩家
    int o, k; // 操作码和k
    string player_name[] = {"Renko", "Merry"};
    // 初始化所有玩家的钱
    player_money[0] = m;
    player_money[1] = m;
    // 初始化玩家的位置
    player_pos[0] = 0;
    player_pos[1] = 0;
    // 初始化每个建筑每层的价格
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < l; j++)
        {
            cin >> c[i][j];
        }
    }
    // 初始化每个建筑的基础层级为0
    memset(b_level, 0, sizeof(b_level));
    // 初始化每个建筑的当前费用为0
    memset(b_money, 0, sizeof(b_money));
    // 初始化每个建筑的所有者为-1,表示没有人
    memset(b_owner, -1, sizeof(b_owner));
    for (int i = 0; i < n; i++)
    {
        cin >> d[i];
    }
    while(cin >> o >> k)
    {
        if (o == 1)
        {
            // 换玩家
            cur_player = (cur_player + 1) % 2;
            if (cur_player == 0)
            {
                // 每个玩家加钱
                for (int i = 0; i < n; i++)
                {
                    if (b_owner[i] != -1)
                    {
                        // 当前建筑有所属人,则给建筑的所属人加当前建筑的d费
                        player_money[b_owner[i]] += d[i];
                    }
                }
            }
            // 玩家走
            for (int i = 0; i < k; i++)
            {
                // 走一格
                player_pos[cur_player] = (player_pos[cur_player] + 1) % n;
                // 看看当前格子有没有建筑
                if (b_owner[player_pos[cur_player]] == -1)
                {
                    continue;
                }
                else if(b_owner[player_pos[cur_player]] == cur_player)
                {
                    // 给当前用户加钱
                    player_money[cur_player] += b_money[player_pos[cur_player]];
                }
                else
                {
                    // 减去当前建筑费用
                    player_money[cur_player] -= b_money[player_pos[cur_player]];
                    // 不是当前用户
                    if (player_money[cur_player] < 0)
                    {
                        // 钱不够,输出当前用户,游戏结束
                        cout << player_name[cur_player];
                        return 0;
                    }
                    player_money[cur_player ^ 1] += b_money[player_pos[cur_player]];
                }
            }
        }
        else
        {
            if (b_owner[player_pos[cur_player]] == cur_player || b_owner[player_pos[cur_player]] == -1)
            {
                // 将建筑所属设置为当前玩家
                b_owner[player_pos[cur_player]] = cur_player;
                // 允许升级
                for (int i = 0; i < k; i++)
                {
                    if (b_level[player_pos[cur_player]] + 1 > l) break;// 当前建筑的级别已经到最高,不能升级
                    if (c[player_pos[cur_player]][b_level[player_pos[cur_player]]] > player_money[cur_player])
                        break; // 没钱,不能升级
                    // 扣钱
                    player_money[cur_player] -= c[player_pos[cur_player]][b_level[player_pos[cur_player]]];
                    // 升级
                    b_money[player_pos[cur_player]] += c[player_pos[cur_player]][b_level[player_pos[cur_player]]];
                    b_level[player_pos[cur_player]]++;
                }
            }
        }
    }
    // 每个玩家加钱
    for (int i = 0; i < n; i++)
    {
        if (b_owner[i] != -1)
        {
            // 当前建筑有所属人,则给建筑的所属人加当前建筑的d费
            player_money[b_owner[i]] += d[i];
        }
    }
    // 输出
    cout << player_money[0] << " " << player_money[1];
    return 0;
}
//耗时:
//测试次数:
//提交次数:
//评分:
//时间复杂度:
//空间复杂度:
//类型:模拟与高精度
//大改:次
//小改:次
2024/11/2 17:35
加载中...