牛牛最近迷上了一種叫鬥地主的撲克遊戲。鬥地主是一種使用黑桃、紅心、梅花、方片的\(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...