洛谷P2668 鬥地主

2022-06-13 15:00:08 字數 1596 閱讀 7890

牛牛最近迷上了一種叫鬥地主的撲克遊戲。鬥地主是一種使用黑桃、紅心、梅花、方片的\(a\)到\(k\)加上大小王的共\(54\)張牌來進行的撲克牌遊戲。在鬥地主中,牌的大小關 系根據牌的數碼表示如下:\(3<4<5<6<7<8<9<10,而花色並不對牌的大小產生影響。每一局遊戲中,一副手牌由 \(n\) 張牌組成。遊戲者每次可以根據規定的牌型進行出牌,首先打光自己的手牌一方取得遊戲的勝利。

現在,牛牛只想知道,對於自己的若干組手牌,分別最少需要多少次出牌可以將它們打光。請你幫他解決這個問題。

需要注意的是,本題中遊戲者每次可以出手的牌型與一般的鬥地主相似而略有不同。具體規則如下:

此**也可以 ac p2540 鬥地主增強版

今年 csp 考了一道模擬,不知道 noip 會不會考一些奇奇怪怪的題,所以就隨便找了一道 noip 歷年的搜尋來寫。

這道題思路很簡單,就是直接按順子,帶牌,單牌來搜。加上一點小剪枝就可以了。

注意到了出單牌的時候就不要用遞迴去搜了,直接for一遍就可以了。否則會 t。

#include using namespace std;

const int qayyds[4]=;

int q,n,ans,a[20];

int mincnt(int l,int r)

void dfs(int n,int cnt,int f1,int f2,int f3)

// 順子

if (f1!=-1)

for (int k=f1;k<=3;k++)

for (int i=3;i<=14;i++)

for (int j=i+qayyds[k];j<=14;j++)

if (mincnt(i,j)>=k)

else break;

// 四帶

if (f2!=-1)

for (int i=f2;i<=14;i++)

if (a[i]>=4)

a[j]+=2;

}for (int j=0;j<=14;j++)

if (a[j])

a[j]++;

}a[i]+=4;

}// 三帶

if (f3!=-1)

for (int i=f3;i<=14;i++)

if (a[i]>=3)

for (int j=0;j<=14;j++)

if (a[j])

a[i]+=3;

}for (int i=0;i<=14;i++)

if (a[i]) cnt++;

if (a[0] && a[1]) cnt--;

ans=min(ans,cnt);

if (a[0] && a[1]) cnt++;

for (int i=0;i<=14;i++)

if (a[i]) cnt--;

}int main()

dfs(n,0,1,2,2);

printf("%d\n",ans);

} return 0;

}

洛谷 P2668 鬥地主

牛牛最近迷上了一種叫鬥地主的撲克遊戲。鬥地主是一種使用黑桃 紅心 梅花 方片的a到k加上大小王的共54張牌來進行的撲克牌遊戲。在鬥地主中,牌的大小關係根據牌的數碼表示如下 3 4 5 6 7 8 9 10現在,牛牛只想知道,對於自己的若干組手牌,分別最少需要多少次出牌可以將它們打光。請你幫他解決這個...

題解 P2668 鬥地主

思路 dfs 簡易剪枝 簡易a 我也不知道算不算a dfs引數記錄層數 按消耗牌多少的貪心順序搜尋 有幾種情況可以不用搜尋 但我還是搜尋了 可以用a 估算出來 最後剩下有單牌,對子,三張牌,4炸彈的時候可以直接算出來 還有乙個剪枝,乙個簡簡單單的剪枝 if x ans return 這個因為省略了很...

NOIP2015 鬥地主 洛谷P2668

題目描述 牛牛最近迷上了一種叫鬥地主的撲克遊戲。鬥地主是一種使用黑桃 紅心 梅花 方片的a到k加上大小王的共54張牌來進行的撲克牌遊戲。在鬥地主中,牌的大小關係根據牌的數碼表示如下 3 4 5 6 7 8 9 10 include include include using namespace st...