牛牛最近迷上了一種叫鬥地主的撲克遊戲。鬥地主是一種使用黑桃、紅心、梅花、方片的a到k加上大小王的共5張牌來進行的撲克牌遊戲。在鬥地主中,牌的大小關 系根據牌的數碼表示如下:3<4<5<6<7<8<9<10現在,牛牛只想知道,對於自己的若干組手牌,分別最少需要多少次出牌可以將它們打光。請你幫他解決這個問題。
需要注意的是,本題中遊戲者每次可以出手的牌型與一般的鬥地主相似而略有不同。具體規則如下:
第一行包含用空格隔開的2個正整數 t,n ,表示手牌的組數以及每組手牌的張數。
接下來 t 組資料,每組資料 n 行,每行乙個非負整數對 $ a_i , b_i $ ,表示一張牌,其中 $ a_i \(表示牌的數碼,\) b_i $ 表示牌的花色,中間用空格隔開。特別的,我們用 1 來表示數碼 a, 11 表示數碼j , 121212 表示數碼q,13表示數碼 k;黑桃、紅心、梅花、方片分別用 1−4 來表示;小王的表示方法為 01 ,大王的表示方法為 02 。
共 t 行,每行乙個整數,表示打光第 iii 組手牌的最少次數。
1 87 4
8 49 1
10 4
11 1
5 11 4
1 11 17
12 3
4 32 3
5 410 2
3 312 2
0 11 3
10 1
6 212 1
11 3
5 212 4
2 27 2
樣例1說明
共有1組手牌,包含8張牌:方片7,方片8,黑桃9,方片10,黑桃j,黑桃5,方片a以及黑桃a。可以通過打單順子(方片7,方片8,黑桃9,方片10,黑桃j),單張牌(黑桃5)以及對子牌(黑桃a以及方片a)在3次內打光。
對於不同的測試點, 我們約定手牌組數t與張數n的規模如下:
該做法有乙個前提,資料是隨機的,出牌順序對後來的決策沒有影響。似乎是一道搜尋+貪心+模擬的題目。在所有出牌規則中,我們先尋找形式固定的四帶
二、三帶
一、炸彈、三張牌、對子(火箭也算對子)和單張牌。設b[i]表示張數為i的牌有多少種。對於四帶二,如果有四張的,我們就依次看b[2]是否大於等於2、b[1]是否大於等於1、b[2]是否大於等於1,。滿足條件就按對應情況出牌。三帶一同理。每齣一次就把帶的牌在b中對應的種數減掉。那麼最後剩下的b中的值的和就是我們如果要出完手中的牌不計順子所需要次數。用它去更新答案。注意,這個是有用的,在只能單個組合打出時它能統計答案。然後是順子。其實每個順子都差不多,用兩重迴圈在計數陣列a中找到滿足條件的連續的牌並減去對應的值,如果不連續了就退出。如果連續區間的長度大於要求長度就搜尋下一層。記得退出時復原a陣列。注意k和a也算是連續的。
#include #include #include #define n 15
using namespace std;
int t,n,i,a[n],ans,len[4]=;
void dfs(int);
void shunzi(int t,int x)
if(j-i+1>=len[t]) dfs(x+1);
} for(int j=k;j>=i;j--) a[j]+=t; }}
void dfs(int x)
; for(int i=0;i<=13;i++) b[a[i]]++;
for(int i=1;i<=13;i++)
} for(int i=1;i<=13;i++)
} ans=min(ans,x+b[1]+b[2]+b[3]+b[4]);
for(int i=1;i<=3;i++) shunzi(i,x);
}int main()
dfs(0);
cout<
} return 0;
}
Noip2015提高組總結
總體而言noip還行吧,每天前兩題都穩穩地,但是最後一題做得不好。day1,看完題目後,第一題簽到,第二題很直觀想出來了,又畫了個圖驗證了一下,tarjan雖然可能爆棧,但人工棧就沒問題了。第三題認為是dp一類的東西。畢竟是第一次提高組,還是挺緊張的,一二題打得特別仔細特別慢,對拍,肉眼查錯,搞了接...
NOIP2015提高組解析
題目見此 day1 神奇的幻方 裸裸的模擬 其實也可以發現規律 i 1在i的右上方,如果已經有數了,就填在i的下方 include includeusing namespace std int a 50 50 int nx,ny,n int main else elseelse a tx ty i ...
NOIP 2015提高組 題解 分析
這一次的提高組出的題挺喪心病狂的,似乎比普及組還要容易看出演算法,隨便就400 我在洛谷上測得好像是500多。真不知ccf在想什麼?算了不說那麼多了,直接上分析 以下的題目中d1a表示第一天第一題,d2b表示第二天第三題,以此類推 題目演算法簡單分析 d1a 簡單模擬 d1b 直接掃一遍找最小環,或...