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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[ZJOI2006]超级麻将

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

題目描述

很多人都知道玩麻將,當然也有人不知道,呵呵,不要緊,我在這里簡要地介紹一下麻將規則:

普通麻將有砣、索、萬三種類型的牌,每種牌有1~9個數字,其中相同的牌每個有四張,例如1砣~9砣,1索~9索,1萬~9萬各有4張,所以共36*3=108張牌。胡牌時每人有14張牌,其中只要某人手里有若干句話(就是同種類型的牌連續三張或同種牌三張),另外再加上一對,即可胡牌。當然如果全是對,叫七小對,也可以胡牌。下圖是連三張示例。

要判斷某人是否胡牌,顯然一個弱智的算法就行了,某中學信息學小組超級麻將迷想了想,決定將普通麻將改造成超級麻將。

所謂超級麻將沒有了砣、索、萬的區分,每種牌上的數字可以是1~100,而每種數字的牌各有100張。另外特別自由的是,玩牌的人手里想拿多少張牌都可以,好刺激哦!

刺激歸刺激,但是拿多了怎么胡牌呢?

超級麻將規定只要一個人手里拿的牌是若干句話(三個連續數字的牌各一張組成一句話,三張或者四張同樣數字的牌也算一句話),再加上一對相同的牌,就算胡了。

作為信息學競賽選手的你,麻煩你給這位超級麻將迷編個程序,判斷能否胡牌。

輸入輸出格式

輸入格式:

輸入文件第一行一個整數N(N<=100),表示玩了N次超級麻將。

接下來N行,每行100個數a1..a100,描述每次玩牌手中各種牌的數量。ai表示數字為i的牌有ai張。(0<=ai<=100)

輸出格式:

輸出N行,若胡了則輸出Yes,否則輸出No,注意區分Yes,No的大小寫!

輸入輸出樣例

輸入樣例#1:
3 2 4 0 0 0 0 0 …… 0(一共98個0) 2 4 2 0 0 0 0 …… 0(一共97個0) 2 3 2 0 0 0 0 …… 0(一共97個0) 輸出樣例#1:
Yes Yes No
題解:dp
f[i][j][k][1,0]表示第i個數,選j個,第i-1個數選k個有無對子
1.打出一個對子f[i][j][k][1]|=f[i][j-2][k][0]
2.打出一句話(3個)f[i][j][k][]|=f[i][j-3][k][]
3.打出4個f[i][j][k][]|=f[i][j-4][k][]
4.最復雜的地方,還有玄學
f[i][j][k][]|=f[i-1][k-j][a[i-2]-j][]
不知為何這里條件不能打i>=2,打上就錯,不打就對,應該是某種邊界轉移
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 int f[101][101][101][2],a[101]; 7 int main() 8 {int T,i,j,k; 9 cin>>T; 10 while (T--) 11 { 12 memset(f,0,sizeof(f)); 13 for (i=1;i<=3;i++) 14 { 15 scanf("%d",&a[i]); 16 } 17 f[0][0][0][0]=1; 18 for (i=1;i<=100;i++) 19 { 20 for (j=0;j<=a[i-1];j++) 21 { 22 for (k=0;k<=a[i];k++) 23 { 24 if (k>1) 25 f[i][k][j][1]|=f[i][k-2][j][0]; 26 if (k>2) 27 f[i][k][j][0]|=f[i][k-3][j][0],f[i][k][j][1]|=f[i][k-3][j][1]; 28 if (k>3) 29 f[i][k][j][0]|=f[i][k-4][j][0],f[i][k][j][1]|=f[i][k-4][j][1]; 30 if (j>=k&&a[i-2]>=k) 31 { 32 f[i][k][j][0]|=f[i-1][j-k][a[i-2]-k][0]; 33 f[i][k][j][1]|=f[i-1][j-k][a[i-2]-k][1]; 34 } 35 } 36 } 37 } 38 if (f[100][a[100]][a[99]][1]) cout<<"Yes\n"; 39 else cout<<"No\n"; 40 } 41 }

?

轉載于:https://www.cnblogs.com/Y-E-T-I/p/7258518.html

總結

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

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