6.3 Minefield

原题

我们先从简单的情况来考虑:
当有两个人的时候, T = m a x ( x 1 , x 2 ) T=max(x_1,x_2) T=max(x1,x2)
当有三个人的时候, T = x 1 + x 2 + x 3 T=x_1+x_2+x_3 T=x1+x2+x3
当有四个人的时候 x 1 , x 2 , x 3 , x 4 x_1,x_2,x_3,x_4 x1x2x3,x4(已经按照从小到大顺序排好了),我们有两种选择:
第一种是让 x 1 , x 2 x_1,x_2 x1x2先过去, x 1 x_1 x1回来, x 3 , x 4 x_3,x_4 x3,x4过去, x 2 x_2 x2回来,然后 x 1 , x 2 x_1,x_2 x1x2一起过去, T 1 = x 2 + x 1 + x 4 + x 2 + x 2 T_1=x_2+x_1+x_4+x_2+x_2 T1=x2+x1+x4+x2+x2= x 1 + 3 ∗ x 2 + x 4 x_1+3*x_2+x_4 x1+3x2+x4
第二种:
x 1 x_1 x1 x 4 x_4 x4过去,再回来, x 1 x_1 x1 x 3 x_3 x3过去,再回来,再跟 x 2 x_2 x2一起过去, T 2 = x 4 + x 1 + x 3 + x 1 + x 2 T_2=x_4+x_1+x_3+x_1+x_2 T2=x4+x1+x3+x1+x2= 2 ∗ x 1 + x 2 + x 3 + x 4 2*x_1+x_2+x_3+x_4 2x1+x2+x3+x4

因此,我们在解决n个人的时候,我们需要用时间最短的那两个人带后面的人过去, T = m i n ( x 1 + 2 ∗ x 2 + x n , 2 ∗ x 1 + x n − 1 + x n ) T=min(x_1+2*x_2+x_{n},2*x_1+x_{n-1}+x_{n}) T=min(x1+2x2+xn,2x1+xn1+xn);
代码如下:

#include<iostream>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
int clo[100+5];
int main()
{
    int num;
    cin>>num;
    for(int i=0;i<num;++i)
        cin>>clo[i];
    sort(clo,clo+num);
    int res=0;
    num--;
    while(num>0)
    {
        if(num==1)
        {
            res+=clo[1];
           // cout<<res<<"----"<<endl;
            break;
        }
        if(num==2)
        {
            res+=clo[0]+clo[1]+clo[2];
            //cout<<res<<"/"<<endl;
            break;
        }
        else
        {
            res+=min(clo[0]+clo[1]*2+clo[num],clo[0]*2+clo[num-1]+clo[num]);
           // cout<<res<<"****"<<endl;
            num-=2;
        }
    }
    cout<<res<<endl;
    
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 我可以给你一些提示,你可以使用Python语言来创建一个扫雷游戏:1、首先,你需要创建一个矩阵,用于存储雷的位置;2、其次,你需要定义一些函数,用于处理玩家的输入,以及检查雷的位置;3、最后,你需要定义一个函数,用于计算玩家的胜负。 ### 回答2: 扫雷是一款经典的益智游戏,我们可以使用Python语言来编写一个简单的扫雷小游戏。下面是一个示例代码: ```python import random # 生成雷区 def generate_minefield(size, num_mines): minefield = [[' ' for _ in range(size)] for _ in range(size)] mines = random.sample(range(size*size), num_mines) for idx in mines: row = idx // size col = idx % size minefield[row][col] = 'X' return minefield # 计算周围雷数 def count_mines(minefield, row, col): count = 0 for r in range(max(0, row-1), min(row+2, len(minefield))): for c in range(max(0, col-1), min(col+2, len(minefield))): if minefield[r][c] == 'X': count += 1 return count # 显示雷区 def display_minefield(minefield): for row in minefield: print(' '.join(row)) # 挖掘 def dig(minefield, row, col): if minefield[row][col] == 'X': print('Game Over!') return False else: minefield[row][col] = str(count_mines(minefield, row, col)) return True # 主函数 def play_game(size, num_mines): minefield = generate_minefield(size, num_mines) display_minefield(minefield) while True: row = int(input('请输入行号:')) col = int(input('请输入列号:')) if not dig(minefield, row, col): break display_minefield(minefield) # 执行游戏 play_game(10, 20) ``` 该代码实现了一个基础的扫雷小游戏。运行时,会随机生成一个指定大小的雷区,并在其中随机分布指定数量的雷。玩家根据提示可以逐步挖掘雷区中的方块,如果挖掘到雷,游戏结束,否则会显示方块周围的雷数。玩家可以通过输入行号和列号来进行挖掘。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值