javascript
1028: [JSOI2007]麻将
1028: [JSOI2007]麻將
Time Limit:?1 Sec??Memory Limit:?162 MBSubmit:?2638??Solved:?1168
[Submit][Status][Discuss]
Description
麻將是中國(guó)傳統(tǒng)的娛樂工具之一。麻將牌的牌可以分為字牌(共有東、南、西、北、中、發(fā)、白七種)和序數(shù)
牌(分為條子、餅子、萬子三種花色,每種花色各有一到九的九種牌),每種牌各四張。在麻將中,通常情況下一
組和了的牌(即完成的牌)由十四張牌組成。十四張牌中的兩張組成對(duì)子(即完全相同的兩張牌),剩余的十二張
組成三張一組的四組,每一組須為順子(即同花色且序數(shù)相連的序數(shù)牌,例如條子的三、四、五)或者是刻子(即
完全相同的三張牌)。一組聽牌的牌是指一組十三張牌,且再加上某一張牌就可以組成和牌。那一張加上的牌可以
稱為等待牌。在這里,我們考慮一種特殊的麻將。在這種特殊的麻將里,沒有字牌,花色也只有一種。但是,序數(shù)
不被限制在一到九的范圍內(nèi),而是在1到n的范圍內(nèi)。同時(shí),也沒有每一種牌四張的限制。一組和了的牌由3m + 2張
牌組成,其中兩張組成對(duì)子,其余3m張組成三張一組的m組,每組須為順子或刻子。現(xiàn)給出一組3m + 1張的牌,要
求判斷該組牌是否為聽牌(即還差一張就可以和牌)。如果是的話,輸出所有可能的等待牌。
Input
包含兩行。第一行包含兩個(gè)由空格隔開整數(shù)n, m (9<=n<=400, 4<=m<=1000)。第二行包含3m + 1個(gè)由空格隔開
整數(shù),每個(gè)數(shù)均在范圍1到n之內(nèi)。這些數(shù)代表要求判斷聽牌的牌的序數(shù)。
Output
輸出為一行。如果該組牌為聽牌,則輸出所有的可能的等待牌的序數(shù),數(shù)字之間用一個(gè)空格隔開。所有的序數(shù)
必須按從小到大的順序輸出。如果該組牌不是聽牌,則輸出"NO"。
Sample Input
9 41 1 2 2 3 3 5 5 5 7 8 8 8
Sample Output
6 7 9 剛開始看這題覺得應(yīng)該是個(gè)非常繁瑣的搜索。。。然后發(fā)現(xiàn)牌的總的數(shù)字比較小,然后就有了一個(gè)奇怪的思路,不如直接枚舉所有可能出現(xiàn)的牌,然后判斷它是否是一張聽牌就行了。。。 然后發(fā)現(xiàn)這個(gè)思路并沒有什么大問題。對(duì)于所有的牌進(jìn)行桶排計(jì)數(shù),然后可以發(fā)現(xiàn)的是一個(gè)牌如果能組成三個(gè)的刻子,那么就組成刻子,剩下的牌和后面的組成順子,就不會(huì)發(fā)生沖突。 代碼如下: #pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <cstdlib> #include <cmath> #include <string> #include <cstring> #include <cstdio> #include <algorithm> #include <queue> #include <set> #include <map> #define re register #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) using namespace std; typedef long long ll; typedef unsigned long long ull; #define ms(arr) memset(arr, 0, sizeof(arr)) const int inf = 0x3f3f3f3f; int n,m,cnt[2001],f[2001],tot,flag,ans[2001]; inline int read() {int x=0,c=1;char ch=' ';while((ch>'9'||ch<'0')&&ch!='-')ch=getchar();while(ch=='-') c*=-1,ch=getchar();while(ch<='9'&&ch>='0')x=x*10+ch-'0',ch=getchar();return x*c; } int main() {//freopen("date.in","r",stdin);n=read();m=read();for(re int i=0;i<=3*m;i++){int d=read();cnt[d]++;}for(re int i=1;i<=n;i++){cnt[i-1]--;cnt[i]++;flag=0;for(re int j=1;j<=n;j++){if(cnt[j]>=2){if(flag) break;int bj=0;for(re int k=1;k<=n;k++) f[k]=cnt[k];f[j]-=2;f[n+1]=f[n+2]=0;for(re int k=1;k<=n;k++){if(f[k]<0){bj=1;break;}f[k]%=3;f[k+1]-=f[k];f[k+2]-=f[k];}if(f[n+1]<0||f[n+2]<0) bj=1;if(bj==0) flag=1,ans[++tot]=i;}}}if(!tot) cout<<"NO";else for(re int i=1;i<=tot;i++)printf("%d ",ans[i]);return 0; }?
轉(zhuǎn)載于:https://www.cnblogs.com/victorique/p/8808050.html
總結(jié)
以上是生活随笔為你收集整理的1028: [JSOI2007]麻将的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python3 判断大小端的一种方法
- 下一篇: Java关于周跨年的周数计算