zoukankan      html  css  js  c++  java
  • bzoj1028 [JSOI2007]麻将

    Description

    麻将是中国传统的娱乐工具之一。麻将牌的牌可以分为字牌(共有东、南、西、北、中、发、白七种)和序数牌(分为条子、饼子、万子三种花色,每种花色各有一到九的九种牌),每种牌各四张。在麻将中,通常情况下一组和了的牌(即完成的牌)由十四张牌组成。十四张牌中的两张组成对子(即完全相同的两张牌),剩余的十二张组成三张一组的四组,每一组须为顺子(即同花色且序数相连的序数牌,例如条子的三、四、五)或者是刻子(即完全相同的三张牌)。一组听牌的牌是指一组十三张牌,且再加上某一张牌就可以组成和牌。那一张加上的牌可以称为等待牌。在这里,我们考虑一种特殊的麻将。在这种特殊的麻将里,没有字牌,花色也只有一种。但是,序数不被限制在一到九的范围内,而是在(1)(n)的范围内。同时,也没有每一种牌四张的限制。一组和了的牌由(3m + 2)张牌组成,其中两张组成对子,其余(3m)张组成三张一组的m组,每组须为顺子或刻子。现给出一组(3m + 1)张的牌,要求判断该组牌是否为听牌(即还差一张就可以和牌)。如果是的话,输出所有可能的等待牌。

    Input

    包含两行。第一行包含两个由空格隔开整数(n, m)((9leqslant n leqslant 400,4 leqslant m leqslant 1000))。第二行包含(3m + 1)个由空格隔开的整数,每个数均在范围(1)(n)之内。这些数代表要求判断听牌的牌的序数。

    Output

    输出为一行。如果该组牌为听牌,则输出所有的可能的等待牌的序数,数字之间用一个空格隔开。所有的序数必须按从小到大的顺序输出。如果该组牌不是听牌,则输出"NO"。

    Solution

    算是比较毒瘤的阅读题了,对我这种不会打麻将的人来说十分不友好。
    说一下题意吧。牌的序号在(1-n)范围内,一组和了的牌由(3m + 2)张牌组成,其中两张组成对子(序数相同),其余(3m)张组成三张一组的(m)组,每组须为顺子(序数为连续的(i,i+1,i+2))或刻子(序数相同)。现给出一组(3m + 1)张的牌,要求判断该组牌是否为听牌(即还差一张就可以和牌)。如果是的话,输出所有可能的等待牌。
    读懂了就是傻逼题,枚举等待牌暴力check。

    #include<bits/stdc++.h>
    using namespace std;
    
    inline int read() {
    	int x = 0, flag = 1; char ch = getchar();
    	while (ch > '9' || ch < '0') { if (ch == '-') flag = -1; ch = getchar(); }
    	while (ch <= '9' && ch >= '0') { x = x * 10 + ch - '0'; ch = getchar(); }
    	return x * flag;
    }
    inline void write(int x) { if (x > 10) write(x / 10); putchar(x % 10 + '0'); }
    
    #define N 1001
    #define rep(ii, aa, bb) for (int ii = aa; ii <= bb; ii++)
    #define fech(i, x) for (int i = 0; i < x.size(); i++)
    #define ll long long
    
    int n, m;
    int bur[N], tmp[N];
    vector<int> ans;
    
    bool check() {
    	rep(i, 1, n) tmp[i] = bur[i];
    	rep(i, 1, n) while (tmp[i]) {
    		if (tmp[i] >= 3) { tmp[i] -= 3; continue; }
    		if (i <= n - 2 && tmp[i + 1] && tmp[i + 2]) { --tmp[i], --tmp[i + 1], --tmp[i + 2]; continue; }
    		return 0;
    	}
    	return 1;
    }
    
    int main() {
    	cin >> n >> m;
    	rep(i, 1, 3 * m + 1) bur[read()]++;
    	rep(i, 1, n) {
    		bur[i]++;
    		bool flag = 0;
    		rep(j, 1, n)
    			if (bur[j] >= 2) {
    				bur[j] -= 2; flag = check(); bur[j] += 2;
    				if (flag) break;
    			}
    		if (flag) ans.push_back(i);
    		--bur[i];
    	}
    	if (!ans.size()) puts("NO");
    	else {
    		sort(ans.begin(), ans.end()); unique(ans.begin(), ans.end());
    		fech(i, ans) {
    			if(i && ans[i] <= ans[i - 1]) break;
    			write(ans[i]), putchar(' ');
    		}
    	}
    	return 0;
    }
    
  • 相关阅读:
    Web API 强势入门指南
    毫秒必争,前端网页性能最佳实践
    Windbg Extension NetExt 使用指南 【3】 ---- 挖掘你想要的数据 Managed Heap
    Windbg Extension NetExt 使用指南 【2】 ---- NetExt 的基本命令介绍
    Windbg Extension NetExt 使用指南 【1】 ---- NetExt 介绍
    WCF : 修复 Security settings for this service require Windows Authentication but it is not enabled for the IIS application that hosts this service 问题
    透过WinDBG的视角看String
    Microsoft Azure Web Sites应用与实践【4】—— Microsoft Azure网站的“后门”
    企业IT管理员IE11升级指南【17】—— F12 开发者工具
    WCF : 如何将NetTcpBinding寄宿在IIS7上
  • 原文地址:https://www.cnblogs.com/aziint/p/8416177.html
Copyright © 2011-2022 走看看