NOIP2015提高組Day1 鬥地主

2021-09-23 08:00:06 字數 2075 閱讀 3954

這道題做的時候讓我幾近崩潰,因為如果要打暴力的話太煩了不想打 。

但是我們發現:

這樣只要判斷前六種方法就行了,打幾個判斷,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 在第一行但不在最後一列,則將...