日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

1028: [JSOI2007]麻将

發布時間:2025/3/15 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 1028: [JSOI2007]麻将 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1028: [JSOI2007]麻將

Time Limit:?1 Sec??Memory Limit:?162 MB
Submit:?2638??Solved:?1168
[Submit][Status][Discuss]

Description

  麻將是中國傳統的娛樂工具之一。麻將牌的牌可以分為字牌(共有東、南、西、北、中、發、白七種)和序數
牌(分為條子、餅子、萬子三種花色,每種花色各有一到九的九種牌),每種牌各四張。在麻將中,通常情況下一
組和了的牌(即完成的牌)由十四張牌組成。十四張牌中的兩張組成對子(即完全相同的兩張牌),剩余的十二張
組成三張一組的四組,每一組須為順子(即同花色且序數相連的序數牌,例如條子的三、四、五)或者是刻子(即
完全相同的三張牌)。一組聽牌的牌是指一組十三張牌,且再加上某一張牌就可以組成和牌。那一張加上的牌可以
稱為等待牌。在這里,我們考慮一種特殊的麻將。在這種特殊的麻將里,沒有字牌,花色也只有一種。但是,序數
不被限制在一到九的范圍內,而是在1到n的范圍內。同時,也沒有每一種牌四張的限制。一組和了的牌由3m + 2張
牌組成,其中兩張組成對子,其余3m張組成三張一組的m組,每組須為順子或刻子。現給出一組3m + 1張的牌,要
求判斷該組牌是否為聽牌(即還差一張就可以和牌)。如果是的話,輸出所有可能的等待牌。

Input

  包含兩行。第一行包含兩個由空格隔開整數n, m (9<=n<=400, 4<=m<=1000)。第二行包含3m + 1個由空格隔開
整數,每個數均在范圍1到n之內。這些數代表要求判斷聽牌的牌的序數。

Output

  輸出為一行。如果該組牌為聽牌,則輸出所有的可能的等待牌的序數,數字之間用一個空格隔開。所有的序數
必須按從小到大的順序輸出。如果該組牌不是聽牌,則輸出"NO"。

Sample Input

9 4
1 1 2 2 3 3 5 5 5 7 8 8 8

Sample Output

6 7 9 剛開始看這題覺得應該是個非常繁瑣的搜索。。。然后發現牌的總的數字比較小,然后就有了一個奇怪的思路,不如直接枚舉所有可能出現的牌,然后判斷它是否是一張聽牌就行了。。。 然后發現這個思路并沒有什么大問題。對于所有的牌進行桶排計數,然后可以發現的是一個牌如果能組成三個的刻子,那么就組成刻子,剩下的牌和后面的組成順子,就不會發生沖突。 代碼如下: #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; }

?

轉載于:https://www.cnblogs.com/victorique/p/8808050.html

總結

以上是生活随笔為你收集整理的1028: [JSOI2007]麻将的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。