這道題做的時候讓我幾近崩潰,因為如果要打暴力的話太煩了不想打 。
但是我們發現:
這樣只要判斷前六種方法就行了,打幾個判斷,30~
首先,做一下基本處理(簡化題目):
因為一般的鬥地主除了大王小王,沒有花色的大小區別,但這裡也不是讓你贏,只是自己乙個人快速打光牌。
我們發現花色並沒有什麼用,可以免去。
所以我們我們用乙個桶sum
sumsu
m來存每張牌。
但,眾所周知,雖然a是1,2是2,大小王是0,但其它牌接下來,我們可以用乙個遞迴列舉順子,遞迴引數存出順子的數量。
我們很容易得到:
1.除順子外,出的牌越多越好。(即能n帶n,自然帶上)
2.有時候不出順子比除順子好。
所以我們每次先把不出順子的出牌次數求出。(即按四帶兩對——>四帶二——>三帶二——>三帶一的順序打)
然後判斷當前不出順子的出牌次數+出順子的數量是否大於答案,即更新答案。
然後列舉三種順子:
單,雙和三順。
列舉順子起點,順子長度,判斷可行,更新遞迴。
ok!
**:
#include
#include
#include
#define n 20
#define max 2147483647
using namespace std;
int t,n,x,y,ans,j;
int sum[n]
;inline
intread()
//快讀加速
return x*y;
}int
qwer()
//非順子出牌
while
((y/2)
&&(zz)
)while
((x/2)
&&(zz)
)while
(y&&z)
while
(x&&z)
ans+
=x+y+z+zz;
return ans;
}void
dfs(
int x)
//遞迴順子if(
!bz)
int t=
qwer()
;//非順子出牌數
ans=
min(ans,t+x)
;//更新
for(
int i=
1;i<=
11;i++
)//三順子
for(
int j=
1;j<=
12-i;j++)if
(bz)
}for
(int i=
1;i<=
10;i++
)//雙順子
for(
int j=
2;j<=
12-i;j++)if
(bz)
}for
(int i=
1;i<=
8;i++
)//單順子
for(
int j=
4;j<=
12-i;j++)if
(bz)}}
intmain()
dfs(0)
;printf
("%d\n"
,ans);}
}
NOIP2015提高組Day1 資訊傳遞
問題描述 有n個同學 編號為1到n 正在玩乙個資訊傳遞的遊戲。在遊戲裡每人都有乙個固定的資訊傳遞物件,其中,編號為i的同學的資訊傳遞物件是編號為ti的同學。遊戲開始時,每人都只知道自己的生日。之後每一輪中,所有人會同時將自己當前所知的生日資訊告訴各自的資訊傳遞物件 注意 可能有人可以從若干人那裡獲取...
NOIP2015提高組Day1鬥地主
仔細看,這道題著實想不到什麼優美的演算法,那麼基本確定方向 dfs。先分析,這題的花色是沒用的 我們再分析,會發現這題的出牌順序是不影響答案的 那麼我們便可以先出牌多的 因為這樣答案便會先便小,那麼便可以方便後面的剪枝 也就是我們先打順子再打帶牌!順子是沒有什麼技巧的,便直接暴搜 當然也是先暴搜長度...
NOIP2015提高組Day1 神奇的幻方
問題描述 幻方是一種很神奇的 n n矩陣 它由數字1,2,3,n n 構成,且每行 每列及兩條對角線上的數字之和都相同。當n為奇數時,我們可以通過以下方法構建乙個幻方 首先將1寫在第一行的中間。之後,按如下方式從小到大依次填寫每個數k k 2,3,n n 1.若 k 1 在第一行但不在最後一列,則將...