首页 > 其他分享 >P2649 游戏预言

P2649 游戏预言

时间:2022-09-20 23:23:34浏览次数:61  
标签:cnt 游戏 ## 样例 张牌 P2649 int 预言 John

# 游戏预言

## 题目描述

John 和朋友们在玩纸牌游戏,他们一共有 $m$ 个人(包括 John)。他们的纸牌比较特殊,一共有 $n \times m$ 张牌,牌号分别为 $1,2,\dots,n \times m$,没有牌号相同的牌。每个人先拿到 $n$ 张牌,然后,每一轮,每个人出一张牌,谁最大则谁赢得这一轮。现在已知 John 手中的 $n$ 张牌,计算他最少能赢得多少轮。

## 输入格式

第一行为两个整数 $m$ 和 $n$。

第二行有 $n$ 个正整数,表示 John 手中的 $n$ 张牌的数值。

## 输出格式

仅一个整数,表示 John 最少能赢的次数。

## 样例 #1

### 样例输入 #1

```
2 5
1 7 2 10 9
```

### 样例输出 #1

```
2
```

## 样例 #2

### 样例输入 #2

```
6 11
62 63 54 66 65 61 57 56 50 53 48
```

### 样例输出 #2

```
4
```

## 提示

对于 $100 \%$ 的数据,$2 \le m \le 20$,$1 \le n \le 50$。

 

首先思考一下:

题目要的是John最少赢几局,那么我们代入对方的视角莱想一想:如果你跟John打牌,你怎么让他赢的次数少呢?假设John出了一张5,你手上有一张6,这时候有两种情况:

①不出这张6,让John赢一次,如果John后面的牌全都≥6那么这张6废了

②出这张6,让John输一次,后面John出什么牌只要我有比他大的就压,比他大的牌出完了他就赢一局

那么按照题目意思,要让John输的次数最多

那么代码思路就出来了,双方都从大到小出牌,遇上自己的牌就加入自己的牌堆(cnt++),如果你有牌而且比John最大的牌还大,那就压上(cnt--);如果比John大的牌出完了就是他赢了(cnt<1,也就是比John的牌更大的牌不足一张)

那么我们需要用桶排序,确认我的牌和John的牌的数量,因为我的牌从大到小排列,只要John最大的牌比我的牌小,那么他后面的所有牌都比我小(废话,但是写进代码里很有用)

下面是代码:

 

#include<iostream>
using namespace std;
//最多有50张牌,从1开始存,所以数组开到51
int a[51];
//最多有20个人,20*50=1000,防止越界就开到1001
bool b[1001];
int main(){
    //cnt记下我比John大的牌的数目
    //ans记录john赢的次数
    int n,m,cnt=0,ans=0;
    cin>>n>>m;
    //桶排序,因为题目说了不会有重复的牌所以不用担心桶排序吞掉牌
    for(int i=1;i<=m;i++){
        cin>>a[i];
        //把John有的牌标记为1
        b[a[i]]=1;
    }
    //从牌堆最后一张开始往前推,其实就是从大到小出牌的模拟
    m*=n;
    for(int i=m;i>=1;i--){
        //如果这张牌是我的,那么放进我的牌堆
        //如果上一张是John的,那也被结算了,要么我有比他还大的牌,要么他赢一次
        if(b[i]==0){
            cnt++;
        }
        //如果这张牌是他的,判断我有没有比他大的牌,如果cnt>=1说明我有一张牌比他这张更大
        //根据我们的思路,我们要把这张牌出了,也就是cnt--
        else if(cnt>=1)cnt--;
        //如果cnt<1说明我没牌比他大,也就是比他大的牌全出完了,那他就赢了这一局
        //ans++
        else ans++;
    }
    //输出ans
    cout<<ans;
    return 0;
}

 

标签:cnt,游戏,##,样例,张牌,P2649,int,预言,John
From: https://www.cnblogs.com/Ghost1GM/p/16714039.html

相关文章

  • 实例化、销毁游戏物体
    1.实例化游戏物体1.游戏中的案例介绍在很多MMORPG类的游戏中都有类似于“金钱副本”的副本关卡。在这类副本中通常都是限定一个时间,在这个时间内玩家可以尽情的破坏,然......
  • 洛谷P1290 欧几里德的游戏
    链接:https://www.luogu.com.cn/problem/P1290不妨假设\(b\leqa\)。显然,当\(a\)是\(b\)的倍数时,为必胜态。接下来考虑\(a\)不为\(b\)的倍数时:1.\(a\)小于\(2*b\)时,当前......
  • 数字游戏II
    数位DP原题链接题目描述:计算[l,r]之间各位数字之和MODN==0的数的个数状态定义:f[i][j]表示共有i位,且数字之和为j的数的总个数设最高位为数字k,则状态转移:\[f_{i,j......
  • 在科学课程中提高学生的学习能力 ——基于游戏的协作学习方法
    在科学课程中提高学生的学习能力——基于游戏的协作学习模式(Acollaborativegame-basedlearningapproachtoimprovingstudents’learningperformanceinsciencec......
  • Java实现猜拳小游戏
    Java实现猜拳游戏的核心在于电脑随机数的生成,Java中的随机数生成方法是:首先引入包  importjava.util.*; 然后  intr=newRandom().nextInt(3); (nextInt中的数......
  • 猜数字游戏脚本
    #!/bin/bashn=$(echo$((RANDOM%100+1)))echo$nwhile:do read-p"请输入1-100以内的数字:"n1 if[-z"$n1"];then    echo"必须要输入一个数字,请重试!!" ......
  • LeetCode — 跳跃游戏 III
    LeetCode—跳跃游戏III问题陈述给定一个非负整数数组arr,您最初位于开始数组的索引。当你在索引一世,你可以跳到i+arr[i]或者i—arr[i],检查是否可以......
  • 从零开始游戏开发——3.4 片断处理
    在光栅阶段,除了要通过片断着色程序(OpenGL叫法)着色外,还需要进行裁剪测试、Alpha测试、模板测试、深度测试、混合操作,这些操作在OpenGL、D3D、Vulkan等操作顺序不尽相同,......
  • 数字游戏
    原题链接数位DP题目描述:计算[l,r]区间中的非下降数的个数不降数:从高位到低位上各位数字呈非下降关系:如123,446直接上代码Code#include<iostream>#include<cstri......
  • 报告分享|中国音数协游戏工委:2022中国移动游戏市场广告营销报告
    全文链接:http://tecdat.cn/?p=28490中国音数协游戏工委、中国游戏产业研究院、京师游戏研究实验室、CC-Smart新传智库、腾讯广告共同发布《2022中国移动游戏市场广告营销......