考试T3麻将
这题就是一个简单的暴力,但考试的时候不知道脑子在想什么,什么都没打出来,也许是我想的太多了。。。
这道题对于不会打麻将的人来说还是有点难理解规则的,我没说过我会打麻将,这里是题目链接。
20分思路,利用深搜来寻找答案,我们先枚举每一张听牌,那么很显然,时间复杂度就是O(n),再用深搜来判断可否胡牌。首先,我们用t[x]t[x]来表示数值为x的牌出现了多少次。那么我们就从1到n枚举对子,再枚举刻子和顺子。那么深搜的时间复杂度约是O(2n2),合起来就是O(2n^3)O(2n3)。因为9<=n<=400,所以会超时。但是不能够同时枚举多个顺子。
100分思路:
还是先枚举听牌,然后再枚举对子,接着枚举多对刻子,最后再枚举顺子。
如果我们设e数组是当前的牌的状态,那么关键代码就是:
e[j]%=; e[j+]-=e[j]; e[j+]-=e[j];
那么当e[j]<0时就说明这张牌不是听牌。
下面给一组数据用于对拍:
数据输入:
9 4
1 2 3 3 4 4 5 6 8 8 9 9 9
数据输出:
2 5
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
int n,m;
bool flag=;
const int maxn=1e6+;
int t[maxn];
int e[maxn];
bool check()
{
for(int i=;i<=n;i++)
{
if(t[i]>=)
{
bool ju=;
t[i]-=;
for(int j=;j<=n+;j++)
{
e[j]=t[j];
}
for(int j=;j<=n+;j++)
{
if(e[j]<)
{
ju=;
break;
}
e[j]%=;
e[j+]-=e[j];
e[j+]-=e[j];
}
t[i]+=;
if(ju==)
{ return ;
}
}
}
return ;
}
int main()
{
cin>>n>>m;
for(int i=;i<=*m+;i++)
{
int x;
cin>>x;
t[x]++;
}
for(int i=;i<=n;i++)
{
t[i]++;
memset(e,,sizeof(e));
if(check()==)
{
flag=;
cout<<i<<" ";
}
t[i]--;
}
if(flag==)
{
cout<<"NO";
}
return ;
}
然后好心提供所有数据。。。
链接: https://pan.baidu.com/s/1aZVMqiRhYBqbMgofuzcLIw
提取码: f8ad
考试T3麻将的更多相关文章
- 2018-8-10考试 T3. 朝暮(akekure)
题目大意:有$n$个点和$m$条边的图($n - 1 \leq m \leq n + 5$),每个点要么黑要么白,两个黑点不可以相邻,问方案数 题解:可以发现当图为一棵树的时候只需要一个树形$DP$ ...
- 2019.2.25考试T3, 离线+线段树
\(\color{#0066ff}{题解}\) #include<bits/stdc++.h> #define LL long long LL in() { char ch; LL x = ...
- 2019.2.14 考试T3 交互题
\(\color{#0066ff}{ 题目描述 }\) 由于机房被成功拯救了,花_Q很高兴,花_Q生成了一个 0 到 N - 1 的排列(排列的下标从 0 到 N - 1 ).保证排列中 0 在 N ...
- 某考试 T3 C
找不着原题了. 原题大概就是给你一条直线上n个点需要被覆盖的最小次数和m条需要花费1的线段的左右端点和1条[1,n]的每次花费为t的大线段. 问最小花费使得所有点的覆盖数都达到最小覆盖数. 感觉这个函 ...
- 某考试 T3 Try to find out the wrong in the test
Discription Hint: 对于 100% 的数据, n<=10^6.
- 某考试 T3 bitboard
bitboardDiscription 天才发明家小K 制造了一块比特板.板子上有2^n个比特元,编号为0 ∼ 2^n−1.每个比特元
- 某考试 T3 sine
推完一波式子之后发现是个矩阵23333. 其实只要发现是矩阵之后就是个水题了. #include<bits/stdc++.h> #define ll long long using nam ...
- 16.1113 模拟考试T3
城堡[问题描述]给定一张N个点M条边的无向连通图,每条边有边权.我们需要从M条边中选出N − 1条, 构成一棵树. 记原图中从 1 号点到每个节点的最短路径长度为?Di ,树中从 1 号点到每个节点的 ...
- 题解【2.23考试T3】val
3. val[题目描述] 这是一道传统题,源代码的文件名为 val.cpp/c/pas. 有一个值初始为 0,接下来 n 次你可以令其在之前基础上+2 或+1 或-1.你需要保证,这个值在整个过程中达 ...
随机推荐
- 深入理解C# 委托(delegate)-戈多编程
今天来谈谈委托,深入理解委托,本文来自各大神经验总结. 1.委托是什么? 委托类型的声明与方法签名相似. 它有一个返回值和任意数目任意类型的参数,是一种可用于封装命名方法或匿名方法的引用类型. 委托类 ...
- Java源码解析|HashMap的前世今生
HashMap的前世今生 Java8在Java7的基础上,做了一些改进和优化. 底层数据结构和实现方法上,HashMap几乎重写了一套 所有的集合都新增了函数式的方法,比如说forEach,也新增了很 ...
- AlexNet网络
AlexNet 中包含了比较新的技术点,首次在CNN中成功应用了 ReLu .Dropout和LRN等Trick. 1.成功使用了Relu作为CNN的激活函数,并验证其效果在较深的网络中超过了Sigm ...
- VMware虚拟机的三种网络管理模式
VMware提供了三种网络工作模式:Bridged(桥接模式).NAT(网络地址转换模式).Host-Only(仅主机模式). 打开VM虚拟机,在选项栏“编辑”->“虚拟网络编辑器”中看到V ...
- powershell加载EXE进内存运行
当实战中我们想在目标上运行一些相当复杂的功能,这些功能常是 EXE 文件的一部分.我不想直接在目标上放置一个二进制文件,因为这样可能会触发反病毒机制.一个很好的思路就是将二进制文件嵌入到 Powers ...
- 前端模块化(CommonJs,AMD和CMD)
前端模块规范有三种:CommonJs,AMD和CMD. CommonJs用在服务器端,AMD和CMD用在浏览器环境 AMD 是 RequireJS 在推广过程中对模块定义的规范化产出. CMD 是 S ...
- java与java web数组括号的不同
由于之前学JAVA SE数组时习惯了数组括号的写法,到了Web这里写了有点不太习惯了,赶快写篇博客加深一下印象哈 一. java和java web中的数组的不同 java: int[] arr = n ...
- c++11::std::remove_reference
引用移除 : remove_reference 引用折叠规则 A& & 折叠成 A& A& && 折叠成 A& A&& &a ...
- go-go协程
package main import ( "fmt" "runtime" "time" ) func test() { defer fmt ...
- PHP代码审计基础-初级篇
对于php代码审计我也是从0开始学的,对学习过程进行整理输出沉淀如有不足欢迎提出共勉.对学习能力有较高要求,整个系列主要是在工作中快速精通php代码审计,整个学习周期5天 ,建议花一天时间熟悉php语 ...